2015-01-25 1 views
0

Я использовал maven-assembly-plugin, чтобы поместить всю мою зависимость в папку lib - Я могу подтвердить, что требуемая зависимость jar находится внутри папки lib.Dependency присутствует в MANIFEST.MF, но все-таки получить NoClassDefFoundError

Я использую maven-jar-plugin со следующим фрагментом, чтобы связать с зависимостями в папке lib:

<configuration> 
    <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
      <classpathPrefix>lib/</classpathPrefix> 
      <mainClass>my.main.class.MainClass</mainClass> 
     </manifest> 
    </archive> 
</configuration> 

Я использовал jd-gui.exe декомпилировать мой jar и я могу видеть, что файл MANIFEST.MF содержит свою зависимость как lib/MyLibFile.jar.

Однако, когда я пытаюсь запустить мое приложение в среде Linux, так как:

java -cp MyApp.jar my.class.app.MainClass ...

я NoClassDefFoundError. Однако, если я делаю следующее:

java -cp MyApp.jar:lib/* my.class.app.MainClass ...

прогонов приложения.

Может ли кто-нибудь указать, почему MyApp.jar не может прочитать файл зависимой библиотеки во время выполнения?

Update:

Пробовал с java -jar MyApp.jar и это тоже не работает. Я считаю, что что-то не так с моим MANIFEST.MF, но я не могу найти проблему.

EDIT:

Ниже мой упрощенный MANIFEST.MF -

Manifest-Version: 1.0 
Built-By: dev 
Build-Jdk: 1.7.0_25 
Class-Path: lib/LibA.jar lib/LibB.jar lib/MyLibFile.jar 
Created-By: Apache Maven 
Main-Class: my.main.class.MainClass 
Archiver-Version: Plexus Archiver 

структура каталогов проекта:

lib/ 
config/ 
MyApp.jar 

Содержание lib каталога:

LibA.jar 
LibB.jar 
MyLibFile.jar 

Моя зависимость находится в MyLibFile.jar.

Я бегу мое приложение на первый cd в мой каталог проекта, то оттуда я исполняю java -jar MyApp.jar

Это StackTrace:

Exception in thread "main" java.lang.NoClassDefFoundError: dependency/lib/path/ClassName 
     at my.class.path.MyApp.main(MyApp.java:65) 
Caused by: java.lang.ClassNotFoundException: dependency.lib.path.ClassName 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 1 more 
+0

'Библиотека/MyLibFile.java' не полезно CLASSPATH, и это не то, что вы должны увидеть в манифесте, сгенерированном вышеуказанным XML. Он должен указывать файлы .class или .jar. – EJP

+0

Почему бы не запустить его как 'java -jar MyApp.jar'? –

+0

@EJP Спасибо, что указали, что это была опечатка, у меня есть зависимость как 'MyLibFile.jar' – czchlong

ответ

1
java -cp MyApp.jar my.class.app.MainClass 

Вышеприведенная команда не заботится о манифест файла jar. Он явно устанавливает путь к MyApp.jar только и просит запустить класс my.class.app.MainClass вместо основного набора классов в манифесте.

Выполнение исполняемого файла jar (т.основной класс setin манифеста, со всеми зависимостями, перечисленных в манифесте в пути к классам), вы должны использовать -jar опцию вместо опции -cp:

java -jar MyApp.jar 
+0

Благодарим вас за разъяснение. Я вижу, что многие другие проекты в моей группе работают одинаково, и все они используют одну и ту же библиотеку зависимостей, как и я, но все они запускаются с опцией '-cp'. Это потому, что они «pom.xml» упаковали свой двоичный код, отличный от моего? Что может отличаться между нашими проектами, которые позволят им работать с '-cp', но не моими? – czchlong

+0

они, вероятно, также передают файл jar библиотеки в опции -cp: 'java -cp myApp.jar: lib/myLib.jar some.MainClass' –

+0

Они явно не добавляют путь к классам в командной строке – czchlong

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