Kurzform: Wenn Ihr main in einem jar ist, müssen Sie wahrscheinlich ein zusätzliches '-jar pathTo/yourJar/YourJarsName.jar' explizit deklarieren, damit es funktioniert (auch wenn 'YourJarsName.jar' auf dem Klassenpfad war) (oder, um die ursprüngliche Frage zu beantworten, die vor 5 Jahren gestellt wurde: Sie müssen nicht jedes jar explizit neu deklarieren, aber es scheint, dass Sie sogar mit java6 Ihr eigenes jar neu deklarieren müssen ...)
Langform: (Ich habe dies so explizit gemacht, dass ich hoffe, dass auch Java-Neulinge davon Gebrauch machen können)
Wie viele hier benutze ich Eclipse, um JAR-Dateien zu exportieren: (Datei->Export-->'Runnable JAR File'). Es gibt drei Optionen auf "Library handling" eclipse (Juno) bietet:
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"
Normalerweise würde ich opt2 verwenden (und opt1 war definitiv brechen), jedoch nativen Code in einem der Jars ich verwende ich entdeckt bricht mit dem praktischen "jarinjar" Trick, dass Eclipse nutzt, wenn Sie diese Option auswählen. Auch nach der Erkenntnis, ich brauchte opt3, und dann diesen StackOverflow-Eintrag zu finden, es dauerte noch einige Zeit, um es herauszufinden, wie mein Haupt außerhalb von Eclipse zu starten, so hier ist, was für mich gearbeitet, wie es für andere nützlich ist ...
Wenn du dein Glas benannt hast: "fooBarTheJarFile.jar" und alles so eingestellt ist, dass es in das Verzeichnis: "/theFully/qualifiedPath/toYourChosenDir" exportiert wird.
(d.h. das Feld "Exportziel" lautet: "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar" )
Nachdem Sie auf "Fertig stellen" geklickt haben, werden Sie feststellen, dass Eclipse alle Bibliotheken in einen Ordner mit dem Namen "fooBarTheJarFile_lib" innerhalb des Exportverzeichnisses verschiebt, so dass Sie etwa Folgendes erhalten:
/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
Sie können dann von überall auf Ihrem System mit starten:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(Für Java-Neulinge: 'package.path_to.the_class_with.your_main' ist der deklarierte Paketpfad, den Sie oben in der Datei 'TheClassWithYourMain.java' finden, die das 'main(String[] args){...}' enthält, das Sie von außerhalb von Java ausführen möchten)
Der Fallstrick, den Sie beachten müssen, ist, dass es nicht ausreicht, "fooBarTheJarFile.jar" in der Liste der Jars in Ihrem deklarierten Klassenpfad zu haben. Sie müssen explizit "-jar" deklarieren und den Ort dieses Jars neu deklarieren.
z.B. diese Pause:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
mit relativen Pfaden wiedergegeben:
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
(unter Verwendung der Java-Version "1.6.0_27"; über OpenJDK 64-Bit Server VM auf ubuntu 12.04)