Creé un archivo jar que contiene todas mis cosas compiladas. Además, mi script de compilación de hormigas copia las bibliotecas necesarias en una subcarpeta "libs". La estructura se ve así:
MyProgram.jar
libs/
Entonces, cuando intento ejecutar mi programa ahora, aparece el siguiente error:
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 qué pasó esto?
<manifestclasspath>
;
) en su lugar, ya que en Windows se usan dos puntos para las letras de unidad. El OP utilizó dos puntos y barras diagonales en su pregunta, lo que sugiere que están en Linux o Mac.Cuando
-jar
se utiliza la-cp
opción, la opción se ignora. La única forma de establecer la ruta de clase es utilizando el archivo de manifiesto en el jar.Es más fácil usar la
-cp
opción, agregar su archivo jar a eso y luego llamar explícitamente a la clase principal.Además, suponiendo que la
/home/user/java/MyProgram/jar/libs
carpeta contiene archivos jar (a diferencia de los archivos de clase), esto no funcionará. No puede especificar una carpeta de archivo jar, pero debe especificar cada archivo jar individualmente en la ruta de clase (vale la pena escribir un script de shell simple para hacer esto por usted si hay una cantidad significativa de jar).fuente
Es un poco complicado. El siguiente script es un intento de obtener la ruta de clases del manifiesto del jar y luego permitir agregar entradas de ruta de clases adicionales. Obtuve resultados mixtos con esto, pero quiero compartir el script de todos modos para que pueda ser completamente funcional aquí.
El guión tiene dos nombres
al vincular los dos archivos junto con
con calljar -h puede ver el uso.
fuente
Para pruebas rápidas y únicas de una aplicación, simplemente puede vincular simbólicamente los archivos JAR de dependencia necesarios en el directorio que contiene el archivo JAR de la aplicación principal.
Ejemplo (para una aplicación
app.jar
que usa la biblioteca Eclipse SWT, que en mi caso se instaló en/usr/share/java
):fuente