Я использовал 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
'Библиотека/MyLibFile.java' не полезно CLASSPATH, и это не то, что вы должны увидеть в манифесте, сгенерированном вышеуказанным XML. Он должен указывать файлы .class или .jar. – EJP
Почему бы не запустить его как 'java -jar MyApp.jar'? –
@EJP Спасибо, что указали, что это была опечатка, у меня есть зависимость как 'MyLibFile.jar' – czchlong