我使用maven-assembly-plugin
将所有依赖项放入lib
文件夹 - 我可以确认所需的依赖项jar
位于lib
文件夹中。
我正在使用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
在运行时无法读取依赖库文件吗?
更新
尝试使用java -jar MyApp.jar
但这也无效。我相信我的MANIFEST.MF
出了问题,但我找不到问题。
修改
以下是我简化的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
这是堆栈跟踪:
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 :(得分:1)
java -cp MyApp.jar my.class.app.MainClass
上述命令并不关心jar文件的清单。它明确地将类路径设置为MyApp.jar ,并要求运行类my.class.app.MainClass
而不是清单中设置的主类。
要执行可执行jar文件(即清单中的主类集,并且类路径中清单中列出了所有依赖项),您必须使用-jar
选项而不是-cp
选项:
java -jar MyApp.jar