2015-03-07 4 views
1

Увы, я искал высоко и низко для решения моей проблемы, включая here и here, но безрезультатно.Во время выполнения Java jar возвращает java.lang.NoClassDefFoundError

Итак, ситуация в том, что у меня есть папка с именем bin со всеми моими файлами классов, включая ImpulseResponseFunction. А в другой папке с именем lib у меня есть все библиотеки jar. Я создал следующий файл манифеста в папке META-INF:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.7.0_51-b00 (Oracle Corporation) 
Main-Class: ImpulseResponseFunction 

Так я создаю банку с помощью:

jar cvfm magicCarbon.jar META-INF/MANIFEST.MF bin/*.class -classpath lib 

И я получаю следующий результат:

-classpath : no such file or directory 
added manifest 
adding: bin/ImpulseResponseFunction$1.class(in = 549) (out= 352)(deflated 35%) 
adding: bin/ImpulseResponseFunction.class(in = 3523) (out= 2057)(deflated 41%) 
adding: bin/menuBarSepUp$1.class(in = 703) (out= 443)(deflated 36%) 
adding: bin/menuBarSepUp$2.class(in = 703) (out= 441)(deflated 37%) 
adding: bin/menuBarSepUp$3.class(in = 900) (out= 556)(deflated 38%) 
adding: bin/menuBarSepUp.class(in = 1683) (out= 942)(deflated 44%) 
adding: bin/MyCanvas.class(in = 865) (out= 482)(deflated 44%) 
adding: bin/openImage.class(in = 635) (out= 433)(deflated 31%) 
adding: bin/PlotTimeSeries.class(in = 1760) (out= 974)(deflated 44%) 
adding: bin/WindowSetUp.class(in = 3723) (out= 1952)(deflated 47%) 
adding: lib/(in = 0) (out= 0)(stored 0%) 
adding: lib/jfreechart-1.0.19-experimental.jar(in = 13791) (out= 11975)(deflated 13%) 
adding: lib/jfreechart-1.0.19-src.jar(in = 2009391) (out= 1927691)(deflated 4%) 
adding: lib/hamcrest-core-1.3.jar(in = 45024) (out= 39918)(deflated 11%) 
adding: lib/jfreechart-1.0.19-swt.jar(in = 79793) (out= 74024)(deflated 7%) 
adding: lib/junit-4.11.jar(in = 245039) (out= 215441)(deflated 12%) 
adding: lib/swtgraphics2d.jar(in = 17492) (out= 16614)(deflated 5%) 
adding: lib/jfreesvg-2.0.jar(in = 50769) (out= 47864)(deflated 5%) 
adding: lib/jfreechart-1.0.19.jar(in = 1561720) (out= 1480724)(deflated 5%) 
adding: lib/orsonpdf-1.6-eval.jar(in = 72444) (out= 67006)(deflated 7%) 
adding: lib/jcommon-1.0.23.jar(in = 330246) (out= 305996)(deflated 7%) 
adding: lib/servlet.jar(in = 80054) (out= 70343)(deflated 12%) 
adding: lib/orsoncharts-1.4-eval-nofx.jar(in = 445025) (out= 412412)(deflated 7%) 
adding: lib/magicCarbon.jar(in = 4681972) (out= 4682157)(deflated 0%) 

Так в первую очередь, что происходит с classpath?

Затем, когда я бегу с помощью:

java -jar magicCarbon.jar 

я получаю:

Exception in thread "main" java.lang.NoClassDefFoundError: ImpulseResponseFunction 
Caused by: java.lang.ClassNotFoundException: ImpulseResponseFunctio 
at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:323) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:268) 
Could not find the main class: ImpulseResponseFunction. Program will exit. 

Почему она не может найти ImpulseResponseFunction?

Программа работает все отлично и dandy, когда я запускаю во время выполнения в Eclipse. Проблемы возникают, когда я пытаюсь создать и запустить файл jar.

Если это помогает, я запускаю Ubuntu.

Любая помощь с этим была бы весьма признательна.

Благодаря

+0

Какова ваша цель в вызове 'jar' с' -classpath'? – Drux

+1

'jar' * не имеет опции' -classpath'. Он просто думает, что вы пытаетесь добавить файл под названием -classpath. – immibis

ответ

2

Ваш класс находится в пакете по умолчанию (который, кстати, не является хорошей идеей). Так должно быть в корне баночки. Каталог bin не является пакетом и поэтому не должен находиться в файле jar. Вместо того, чтобы

jar cvfm magicCarbon.jar META-INF/MANIFEST.MF bin/*.class -classpath lib 

использования

cd bin 
jar cvfm ../magicCarbon.jar ../META-INF/MANIFEST.MF *.class 

Кроме того, библиотеки не могут быть внутри банки. Они должны оставаться снаружи. Class-Path manifest entry указывает, из какой внешней библиотеки зависит баночка.

+0

Я использовал: «jar cvfm ../magicCarbon.jar ../META-INF/MANIFEST.MF * .class», как вы предложили и модифицировали файл манифеста, добавив: «Class-Path lib/*», но я все равно получаю ошибка: «Исключение в потоке "основной" java.lang.NoClassDefFoundError: баночка Вызванная: java.lang.ClassNotFoundException: баночка \t в java.net.URLClassLoader $ 1.Run (URLClassLoader.java:217) \t на Java .security.AccessController.doPrivileged (собственный метод) \t at java.net.URLClassLoader.findClass (URLClassLoader.java:205) Не удалось найти основной класс: jar. Программа будет закрыта.' – Oik

+0

Извините, опечатка. Я использовал: Class-Path: lib/* в манифесте. Я также указал все файлы jar явно, например. 'lib/hamcrest-core-1.3.jar lib/jcommon-1.0.23.jar' и т. д., но результат был тот же. – Oik

+0

* Не удалось найти основной класс: jar *: как вы запускаете банку? Почему java считает, что основной класс называется jar? –

-1

Попался в конце с помощью JB Nizet. Спасибо.

Решение:

1) Убедитесь, что файл манифеста (META-INF/MANIFEST.MF) правильно и ссылки правильные библиотеки, используя путь класса. В моем случае это:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.2 
Created-By: 1.7.0_51-b00 (Oracle Corporation) 
Class-Path: lib/jcommon-1.0.23.jar lib/jfreechart-1.0.19.jar 
Main-Class: ImpulseResponseFunction 

Класс-путь должен быть относительно расположения пути к файлу фляги, который вы собираетесь создать или вы можете поставить полный путь к библиотекам. Другими словами, это работает также:

Class-Path: /full/path/name/lib/jarball.jar 

2) перейдите в каталог, где основным классом, потому что это должно быть корнем файла манифеста.

3) Запустите команду jar. Для меня это так, как заявил JB Nizet:

jar cvfm ../magicCarbon.jar ../META-INF/MANIFEST.MF *.class 
+0

Вы не можете поместить полный путь в библиотеки. Элемент class-path - это относительный URL-адрес, базой которого является местоположение содержащего JAR-файла. См. Документацию. – EJP

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