Kurzform: Wenn sich Ihr Main in einem JAR befindet, benötigen Sie wahrscheinlich einen zusätzlichen '-jar pathTo / yourJar / YourJarsName.jar', der explizit deklariert wurde, damit es funktioniert (obwohl sich 'YourJarsName.jar' im Klassenpfad befand) (oder , ausgedrückt, um die ursprüngliche Frage zu beantworten, die vor 5 Jahren gestellt wurde: Sie müssen nicht jedes Glas explizit neu deklarieren, aber es scheint, dass Sie selbst mit Java6 Ihr eigenes Glas neu deklarieren müssen ...)
Lange Form: (Ich habe dies so deutlich gemacht, dass ich hoffe, dass auch Eindringlinge von Java davon Gebrauch machen können.)
Wie viele hier verwende ich Eclipse zum Exportieren von Jars: (Datei-> Exportieren -> 'Runnable JAR File'). Es gibt drei Optionen für die Eclipse-Angebote (Juno) für die Bibliotheksverwaltung:
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 fehlerhaft), aber nativer Code in einem der von mir verwendeten Gläser habe ich mit dem praktischen "jarinjar" -Trick entdeckt, den Eclipse nutzt, wenn Sie diese Option auswählen. Selbst nachdem mir klar wurde, dass ich opt3 benötige und dann diesen StackOverflow-Eintrag gefunden habe, habe ich noch einige Zeit gebraucht, um herauszufinden, wie ich mein Main außerhalb von Eclipse starten kann. Hier ist also, was für mich funktioniert hat, da es für andere nützlich ist ...
Wenn Sie Ihr Glas "fooBarTheJarFile.jar" genannt haben und alles so eingestellt ist, dass es in das Verzeichnis "/ theFully / qualifiedPath / toYourChosenDir" exportiert wird.
(Das Feld "Ziel exportieren" lautet: "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar")
Nachdem Sie auf "Fertig stellen" geklickt haben, finden Sie Eclipse und legen alle Bibliotheken in einem Ordner mit dem Namen "fooBarTheJarFile_lib" in diesem Exportverzeichnis ab.
/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 starten mit:
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 die 'main (String [] args) {.. .} ', die Sie von außerhalb von Java ausführen möchten)
Die Falle, die Sie beachten sollten, ist, dass es nicht ausreicht, 'fooBarTheJarFile.jar' in der Liste der Jars auf Ihrem deklarierten Klassenpfad zu haben. Sie müssen explizit '-jar' deklarieren und den Speicherort dieses Jars neu deklarieren.
zB das bricht:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
angepasst mit relativen Pfaden:
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 die OpenJDK 64-Bit-Server-VM unter Ubuntu 12.04)