2012-06-28 17 views
7

Ho la seguente gerarchia di directory:Creare file jar da linea di comando

SigarTest 
src 
    SigarTest 
    .java files 
bin 
    SigarTest 
    .class files 

Qui, SigarTest è un nome di pacchetto. La cartella principale si trova nella cartella bin di jdk. Da lì, im eseguendo il seguente comando per creare un file jar del mio progetto -

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

dove sono richieste tools.jar, Mongo-2.7.3.jar e sigar.jar e si trovano nella stessa cartella directory root (cartella bin di jdk). Tuttavia, eseguendolo, ottengo

ClassNotFoundException : SigarTest.SigarMain 

Cosa sto facendo di sbagliato?

+0

jar cfe temp.jar SigarTest.SigarMain.class SigarTest/bin .... prova il suo –

+0

@AlpeshPrajapati: Non è lo stesso di quello che ho fatto? – Cygnus

+0

non hai aggiunto .class dopo SigarTest.SigarMain ... –

risposta

5

Utilizza la -Cdir option che

temporaneamente cambia directory (cddir) durante l'esecuzione del comando jar durante l'elaborazione del seguente inputfiles argomento.

Se si esegue il comando jar nella tua domanda ed elencare i contenuti di temp.jar, vedrete un output simile al seguente:

$ 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) 

Nota che avere SigarTest/bin in temp.jar non è corretto. L'esecuzione di temp.jar genera ClassNotFoundException poiché SigarMain è nel pacchetto . Consideriamo ora il jar seguente comando che utilizza l'opzione -Cdir:

$ 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 è nel pacchetto corretta e l'esecuzione di temp.jar non gettare un ClassNotFoundException.

+0

Grazie MOLTO !! Questo lo ha risolto :) – Cygnus

+0

Btw, quando lo fai -C, la directory è cambiata solo per i file che seguono il nome della directory o tutti i valori che seguono quel nome? Secondo questo, dovrebbe essere il secondo giusto? – Cygnus

+1

La documentazione è un po 'confusa su questo. Da alcuni test, ho scoperto che era solo il seguente file, il che spiega perché in '-C SigarTest/bin /. tools.jar', 'SigarMain.class' è preso da' SigarTest/bin/'e' tools.jar' è preso dalla directory 'jar' è stata eseguita. Puoi anche specificare' -C' più volte. – creemama

Problemi correlati