MANIFEST.MF中存在依赖关系,但仍然获得NoClassDefFoundError

时间:2015-01-25 02:07:54

标签: java linux maven

我使用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

1 个答案:

答案 0 :(得分:1)

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

上述命令并不关心jar文件的清单。它明确地将类路径设置为MyApp.jar ,并要求运行类my.class.app.MainClass而不是清单中设置的主类。

要执行可执行jar文件(即清单中的主类集,并且类路径中清单中列出了所有依赖项),您必须使用-jar选项而不是-cp选项:

java -jar MyApp.jar