Eu criei um arquivo jar contendo todas as minhas coisas compiladas. Além disso, meu script ant build copia as bibliotecas necessárias para uma subpasta "libs". A estrutura é semelhante a esta:
MyProgram.jar
libs/
Portanto, quando tento executar meu programa agora, recebo o seguinte erro:
java -cp ".:/home/user/java/MyProgram/jar/libs" -jar MyProgram.jar
java.lang.ClassNotFoundException: org.postgresql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at database.PostgresQL.getConnection(PostgresQL.java:38)
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:19)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
java.lang.NullPointerException
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:25)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
Por que isso acontece?
<manifestclasspath>
;
) em vez de dois pontos no Windows para letras de unidade. O OP usou dois pontos e barras normais em sua pergunta, sugerindo que eles estão no Linux ou Mac.Quando a
-jar
opção é usada, a-cp
opção é ignorada. A única maneira de definir o caminho de classe é usando o arquivo de manifesto no jar.É mais fácil apenas usar a
-cp
opção, adicionar seu arquivo jar a ela e chamar explicitamente a classe principal.Além disso, presumindo que a
/home/user/java/MyProgram/jar/libs
pasta contenha arquivos jar (em oposição aos arquivos de classe), isso não funcionará. Você não pode especificar uma pasta de arquivo jar, mas deve especificar cada arquivo jar individualmente no caminho de classe (vale a pena escrever um script de shell simples para fazer isso para você se houver um número significativo de jars).fonte
É um pouco complicado. O script a seguir é uma tentativa de obter o classpath do manifesto do jar e permitir a adição de entradas de classpath extras. Tive resultados mistos com isso, mas quero compartilhar o script, para que possa ser totalmente funcional aqui.
O script tem dois nomes
vinculando os dois arquivos juntos com
com calljar -h você pode ver o uso.
fonte
Para testes rápidos e únicos de um aplicativo, você pode simplesmente vincular simbolicamente os arquivos JAR de dependência necessários ao diretório que contém o arquivo JAR do aplicativo principal.
Exemplo (para um aplicativo
app.jar
que usa a biblioteca Eclipse SWT, que no meu caso foi instalada/usr/share/java
):fonte