Como criar um .jar de uma aplicação Desktop?

9 respostas
R

Boa tarde pessoal. Sou iniciante em java e acabei uma aplicação desktop sendo que quero gerar um .jar do projeto inteiro inclusive com as bibliotecas.

Meu projeto tem a seguinte estrutura sendo que utilizei o NetBeans pra fazer o mesmo:

ModuloCliente -->(nome do projeto) Pacotes de Codigo Fontes -->(Contém diversos pacotes com as classes da minha aplicação. A classe principal chama "Principal.java") Pacotes de testes -->(Está vazio, criou sozinho e eu não coloquei nada dentro dele) Bibliotecas -->(Contém as bibliotecas que usei na minha aplicação) Bibliotecas de testes -->(O netbeans criou sozinho e contém duas bibliotecas que não usei chamadas JUnit)

Assim pessoal, queria criar um .jar que tivesse tudo dentro dele, inclusive as bibliotecas.

Depois queria encontrar uma maneira de executar a aplicação a partir desse arquivo, mas que não fosse através do console mas sim através de um .exe ou algo assim.

Agradeço muito a atenção e fico no aguardo.

9 Respostas

A

Compile tudo, e crie o jar da classe principal. Automaticamente o NetBeans organizará tudo pra você. E outra, se você tem o jar, você não precisa do exe. Mas se preferir isto, crie um diretório para seu programa, e coloque-o la ex:

C:\arquivos de programas\mySystem\program.jar

Depois crie um programa em C que chame-o através de um comando do sistema:

#include <stdio.h> // default lib
#include <stdlib.h> //system() function

int main(void)
{
/**/system("C:\arquivos de programas\mySystem\program.jar");
}

Lembrando que isto não é recomendável, pois ao invés de um processo (seu programa em Java), você teria 2 processos.

R

Cara, poderia me explicar com mais detalhes como fazer para compailar pelo netbeans e tal? Eu tente gerar um build pelo netbeans, ele até gerou em uma pasta um .jar com o nome do meu projeto, mas olhei dentro do jar e percebi que as bibliotecas não estavam inclusas é tal. Pq assim, quero gerar esse jar para rodar em outros pcs onde terá apenas a maquina virtual instalada.

Sobre a parte de criar um programinha em c para rodar o jar, essa seria a única maneira de executar o jar sem ser pelo dos?

Agradeço a atenção e fico no aguardo.

Grande abraço.

A

Cara, poderia me explicar com mais detalhes como fazer para compailar pelo netbeans e tal? Eu tente gerar um build pelo netbeans, ele até gerou em uma pasta um .jar com o nome do meu projeto, mas olhei dentro do jar e percebi que as bibliotecas não estavam inclusas é tal. Pq assim, quero gerar esse jar para rodar em outros pcs onde terá apenas a maquina virtual instalada.

Sobre a parte de criar um programinha em c para rodar o jar, essa seria a única maneira de executar o jar sem ser pelo dos?

Agradeço a atenção e fico no aguardo.

Grande abraço.

Quando você gera o jar-file você pode rodar em qualquer computador normalmente. Faça o teste colocando o programa em outro computador. Em relação ao executar o jar, o jar-file pode ser executado como um programa normal, não precisa ser necessariamente no prompt ou no shell. No caso do Windows, apenas gere o jar-file e execute-o normalmente, no caso do Linux, onde o mesmo deve ser executado com:

$ java -jar program.jar

Você deve criar um link simbólico em /usr/bin e depois criar um lançador com este caminho. Mas digo isso crendo que seu programa é gráfico, pois se roda em terminal (modo de texto) é melhor executa-lo através dos class-file (arquivos.class)

R

Cara, ao rodar o .jar pelo dos ele me dá esse erro:

Microsoft Windows XP [versão 5.1.2600] C:\Nova pasta>java -jar ModuloCliente.jar Exception in thread "main" java.lang.NoClassDefFoundError: Principal Caused by: java.lang.ClassNotFoundException: Principal at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) Could not find the main class: Principal. Program will exit.

Parece que ele não acha a classe principal né? Meu arquivo manifest está assim:

Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.0 Created-By: 1.6.0_21-b07 (Sun Microsystems Inc.) Main-Class: Principal Class-Path: lib/xstream-1.3.jar lib/xpp3_min-1.1.4c.jar X-COMMENT: Main-Class will be added automatically by build
Sabe qual seria o problema?

Obrigado e fico no aguardo.

A

Cara, ao rodar o .jar pelo dos ele me dá esse erro:

Microsoft Windows XP [versão 5.1.2600] C:\Nova pasta>java -jar ModuloCliente.jar Exception in thread "main" java.lang.NoClassDefFoundError: Principal Caused by: java.lang.ClassNotFoundException: Principal at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) Could not find the main class: Principal. Program will exit.

Parece que ele não acha a classe principal né? Meu arquivo manifest está assim:

Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.0 Created-By: 1.6.0_21-b07 (Sun Microsystems Inc.) Main-Class: Principal Class-Path: lib/xstream-1.3.jar lib/xpp3_min-1.1.4c.jar X-COMMENT: Main-Class will be added automatically by build
Sabe qual seria o problema?

Obrigado e fico no aguardo.

Estranho! Sempre uso em meu manifest.mf:

Manifest-version: 1.0
Main-Class: MainClassOfProject

O seu não parece estar errado. E quando você tenta executar o jar-file diretamente através do clique, o que acontece ?

T

Faz assim:
1° Você vai ter que dizer qual a classe principal do ser projeto, no seu caso “Principal.java”.
Vai em propriedades do projeto --> executar --> Classe Principal e adiciona a tua classe.

2° Já que você que adicionar todas as bibliotecas no mesmo jar faça o que tem nesse link http://java.sun.com/developer/technicalArticles/java_warehouse/single_jar/
eu já fiz isso e não tive problemas.

3º Com isso você poderia executar a sua aplicação com um duplo clique no ser seu.jar gerado ou pelo comando java ?jar seu.jar

Isso deveria funcionar :slight_smile:

R

Cara, quanto ao erro, era gerado pq no manifest faltava indicar o pacote da classe principal, ou seja, ficou assim:

........... Main-Class: meuPacote.Principal ........

Estranho o netbeans não gerar isso corretamente, mas enfim, resolvi isso corrigindo o manifest.

Valeu pela ajuda.

R

Cara, desculpe mas não entendo como fazer seguindo o link que me passou, até mesmo pq meu projeto não tem nenhum buil.xml uma vez que é pra desktop e no link falava sobre o mesmo que deveria ser alterado e tal.

Saberia alguma outra forma de ter as bibliotecas juntas com a aplicação em si?

Agradeço a ajuda e fico no aguardo.

T

Cara, desculpe mas não entendo como fazer seguindo o link que me passou, até mesmo pq meu projeto não tem nenhum buil.xml uma vez que é pra desktop e no link falava sobre o mesmo que deveria ser alterado e tal.
Saberia alguma outra forma de ter as bibliotecas juntas com a aplicação em si?
Agradeço a ajuda e fico no aguardo.

Deve ter sim, mesmo se você tiver criado como JavaApplication.
No teu NetBeans deveria ter 3 abas Projetos (Projects) - Arquivos (Files) - Serviços (Services).
Para visualizar o build.xml você deve está em arquivos

Copia esse código lá, logo acima dá ultima linha onde tem

<target name="package-for-store" depends="jar">

        <!-- Change the value of this property to be the name of your JAR,
             minus the .jar extension. It should not have spaces.
             <property name="store.jar.name" value="MyJarName"/>
        -->
        <property name="store.jar.name" value="ModuloCliente"/>


        <!-- don't edit below this line -->

        <property name="store.dir" value="store"/>
        <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

        <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

        <delete dir="${store.dir}"/>
        <mkdir dir="${store.dir}"/>

        <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
            <zipgroupfileset dir="dist" includes="*.jar"/>
            <zipgroupfileset dir="dist/lib" includes="*.jar"/>

            <manifest>
                <attribute name="Main-Class" value="${main.class}"/>
            </manifest>
        </jar>

        <zip destfile="${store.jar}">
            <zipfileset src="${store.dir}/temp_final.jar"
            excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
        </zip>

        <delete file="${store.dir}/temp_final.jar"/>

    </target>

Depois vai com o botão direito em build.xml --> Executar destino --> Outros destinos --> package-for-store
Deve aparecer CONSTRUÍDO COM SUCESSO e o teu ModuloCliente.jar vai está pronto dentro da pasta store
que está dentro do teu projeto do NetBeans

Espero ter ajudado!

Criado 30 de outubro de 2010
Ultima resposta 31 de out. de 2010
Respostas 9
Participantes 3