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

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.

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:

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

int main(void)
{
/**/system(“C:\arquivos de programas\mySystem\program.jar”);
}[/code]

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

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.

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.[/quote]

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)

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.

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.

[/quote]

Estranho! Sempre uso em meu manifest.mf:

[quote]Manifest-version: 1.0
Main-Class: MainClassOfProject[/quote]

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

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:

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.

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.

[quote]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.[/quote]

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!