Краткая форма: если ваш main находится внутри jar, вам, вероятно, потребуется дополнительный '-jar pathTo / yourJar / YourJarsName.jar', явно объявленный для его работы (даже если 'YourJarsName.jar' находился в пути к классам) (или , выраженный для ответа на первоначальный вопрос, который был задан 5 лет назад: вам не нужно явно повторно декларировать каждую банку, но, похоже, даже с java6 вам нужно переопределить вашу собственную банку ...)
Длинная форма: (Я сделал это явно до такой степени, что я надеюсь, что даже нарушители Java могут использовать это)
Как и многие здесь, я использую eclipse для экспорта jar-файлов: (File-> Export -> 'Runnable JAR File'). В предложении «Затмение библиотеки» (Juno) есть три варианта:
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"
Обычно я бы использовал opt2 (а opt1 определенно ломался), однако нативный код в одном из используемых мной jar-файлов обнаружил разрывы с помощью удобного трюка «jarinjar», который затмевает, когда вы выбираете эту опцию. Даже после того, как я понял, что мне нужен opt3, а затем нашел эту запись в StackOverflow, мне все еще потребовалось некоторое время, чтобы понять, как запустить мой основной за пределами затмения, так что вот что сработало для меня, так как это полезно для других ...
Если вы назвали свой jar: "fooBarTheJarFile.jar" и все настроено на экспорт в каталог: "/ theFully / qualPath / toYourChosenDir".
(имеется в виду поле «Место назначения экспорта»: «/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar»)
После того, как вы нажмете финиш, вы обнаружите, что eclipse помещает все библиотеки в папку с именем 'fooBarTheJarFile_lib' в этом каталоге экспорта, давая вам что-то вроде
/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
Затем вы можете запустить из любой точки вашей системы:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(Для новичков в Java: «package.path_to.the_class_with.your_main» - это объявленный путь к пакету, который вы найдете в верхней части файла «TheClassWithYourMain.java», который содержит «main (String [] args) {.. .} 'что вы хотите запустить из-за пределов Java)
Заметим ловушку: наличие fooBarTheJarFile.jar в списке jar-файлов на объявленном пути к классу недостаточно. Вы должны явно объявить '-jar' и повторно объявить местоположение этого jar.
например это ломает:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
пересчитывается с относительными путями:
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
(с использованием версии Java "1.6.0_27"; через виртуальную машину OpenJDK 64-Bit Server в Ubuntu 12.04)