2012-06-28 2 views
7

У меня есть следующая иерархия каталогов:Создать .jar файл из командной строки

SigarTest 
src 
    SigarTest 
    .java files 
bin 
    SigarTest 
    .class files 

Здесь SigarTest это имя пакета. Корневая папка находится в папке bin jdk. Оттуда им выполнить следующую команду, чтобы создать банку файл моего проекта -

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

, где требуются tools.jar, Монго-2.7.3.jar и sigar.jar и находятся в той же папке, корневой каталог (папка bin в jdk). Однако при его запуске я получаю

ClassNotFoundException : SigarTest.SigarMain 

Что я делаю неправильно?

+0

jar cfe temp.jar SigarTest.SigarMain.class SigarTest/bin .... попробуйте его –

+0

@AlpeshPrajapati: Разве это не так, как я сделал? – Cygnus

+0

Вы не добавили .класс после SigarTest.SigarMain ... –

ответ

5

Используйте -Cdir option, который

Временно изменяет каталоги (cdреж) во время выполнения команды jar при обработке следующей inputfiles аргумент.

Если вы выполняете jar команду в вашем вопросе и список содержимого temp.jar, вы увидите результат, подобный следующему:

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

Обратите внимание, что наличие SigarTest/бен в temp.jar это неверно. Исполнение temp.jar выбрасывает ClassNotFoundException, так как SigarMain находится в упаковке . Теперь рассмотрим следующую jar команду, которая использует -Cреж вариант:

$ 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 находится в правильном пакете и выполнения temp.jar не бросить ClassNotFoundException.

+0

Спасибо LOT !! Это решило это :) – Cygnus

+0

Btw, когда u do -C, является ли каталог изменен только для файлов, следующих за именем каталога или всех значений, следующих за этим именем? В соответствии с этим, это должно быть последнее право? – Cygnus

+1

Документация немного запутанна. Из некоторых тестов я обнаружил, что это был только один файл, который объясняет, почему в '-C SigarTest/bin /. tools.jar', 'SigarMain.class' взято из' SigarTest/bin/'и' tools.jar' взято из каталога 'jar'. Вы также можете указать' -C' несколько раз. – creemama

Смежные вопросы