Forma abbreviata: se il tuo main è all'interno di un jar, probabilmente avrai bisogno di un ulteriore '-jar pathTo / yourJar / YourJarsName.jar' dichiarato esplicitamente per farlo funzionare (anche se 'YourJarsName.jar' era sul percorso di classe) (o , espresso per rispondere alla domanda originale posta 5 anni fa: non è necessario dichiarare esplicitamente ogni vaso, ma sembra che, anche con java6, sia necessario dichiarare il proprio vaso ...)
Long Form: (L'ho reso esplicito al punto che spero che anche gli intrusi di Java possano farne uso)
Come molti qui sto usando eclipse per esportare barattoli: (File-> Esporta -> 'File JAR eseguibile'). Esistono tre opzioni sulle offerte eclipse (Juno) "Gestione librerie":
opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"
Tipicamente userei opt2 (e opt1 si stava decisamente rompendo), tuttavia il codice nativo in uno dei barattoli che sto usando ho scoperto le interruzioni con il pratico trucco "jarinjar" che eclissi sfrutta quando scegli quell'opzione. Anche dopo aver realizzato che avevo bisogno di opt3, e poi aver trovato questa voce StackOverflow, mi ci è voluto ancora un po 'di tempo per capire come avviare il mio principale al di fuori di Eclipse, quindi ecco cosa ha funzionato per me, poiché è utile per gli altri ...
Se hai chiamato il tuo vaso: "fooBarTheJarFile.jar" e tutto è impostato per esportare nella directory: "/ theFully / qualificatoPath / toYourChosenDir".
(nel senso che il campo "Esporta destinazione" leggerà: "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar")
Dopo aver premuto Finish, troverai eclipse quindi inserisce tutte le librerie in una cartella denominata 'fooBarTheJarFile_lib' all'interno di quella directory di esportazione, dandoti qualcosa del tipo:
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar
È quindi possibile avviare da qualsiasi punto del sistema con:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(Per i neofiti di Java: 'package.path_to.the_class_with.your_main' è il percorso del pacchetto dichiarato che troverai all'inizio del file 'TheClassWithYourMain.java' che contiene il 'main (String [] args) {.. .} "che desideri eseguire dall'esterno di Java)
La trappola da notare: è che avere 'fooBarTheJarFile.jar' nell'elenco dei barattoli sul tuo percorso di classe dichiarato non è sufficiente. Devi dichiarare esplicitamente '-jar' e dichiarare nuovamente la posizione di quel vaso.
ad esempio questo si rompe:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
riformulato con percorsi relativi:
cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS: java -cp "fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" -jar package.path_to.the_class_with.your_main.TheClassWithYourMain
WORKS: java -cp ".;fooBarTheJarFile_lib/*" -jar fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(utilizzando la versione java "1.6.0_27"; tramite OpenJDK 64-Bit Server VM su Ubuntu 12.04)