2012-06-28 27 views
7

que tienen la siguiente jerarquía de directorios:Crear archivo jar desde la línea de comandos

SigarTest 
src 
    SigarTest 
    .java files 
bin 
    SigarTest 
    .class files 

Aquí, SigarTest es un nombre de paquete. La carpeta raíz está en la carpeta bin de jdk. A partir de ahí, im ejecutando el siguiente comando para crear un archivo jar de mi proyecto -

./jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 

donde se requieren tools.jar, mongo-2.7.3.jar y sigar.jar y están en la misma carpeta que directorio raíz (carpeta bin de jdk). Sin embargo, al ejecutarlo, obtengo

ClassNotFoundException : SigarTest.SigarMain 

¿Qué estoy haciendo mal?

+0

jar cfe temp.jar SigarTest.SigarMain.class SigarTest/bin .... prueba su –

+0

@AlpeshPrajapati: ¿No es lo mismo que hice? – Cygnus

+0

no ha agregado .class después de SigarTest.SigarMain ... –

Respuesta

5

Uso del -Cdir option cuales

cambia temporalmente directorios (dir cd) durante la ejecución del comando jar al procesar el siguiente inputfiles argumento.

Si se ejecuta el comando jar en su pregunta y la lista de los contenidos de temp.jar, verá una salida similar a la siguiente:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/bin/ 
SigarTest/bin/SigarTest/ 
SigarTest/bin/SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: SigarTest/SigarMain 
Caused by: java.lang.ClassNotFoundException: SigarTest.SigarMain 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

Tenga en cuenta que tener SigarTest/bin en temp.jar Es incorrecto. La ejecución de temp.jar arroja el ClassNotFoundException ya que SigarMain está en el paquete . Consideremos ahora el siguiente comando jar que utiliza el -Cdir opción:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain -C SigarTest/bin/ . tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/ 
SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 

SigarMain está en el paquete correcto y ejecutar temp.jar no lanza un ClassNotFoundException.

+0

¡Muchas gracias! Eso lo resolvió :) – Cygnus

+0

Por cierto, cuando lo hace -C, ¿el directorio ha cambiado solo para los archivos que siguen el nombre del directorio o todos los valores que siguen ese nombre? De acuerdo con esto, debería ser este último ¿no? – Cygnus

+1

La documentación es un poco confusa sobre esto. De algunas pruebas, encontré que era solo el siguiente archivo, lo que explica por qué en '-C SigarTest/bin /. tools.jar', 'SigarMain.class' se toma de' SigarTest/bin/'y' tools.jar' se toma del directorio 'jar' en el que se ejecutó. También puede especificar' -C' varias veces. – creemama

Cuestiones relacionadas