java ClassNotFoundException在运行jar时发生,但在直接运行应用程序时发生
我的应用程序在尝试访问外部依赖项时面临NoClassDefFoundError
,但仅在作为jar运行时
使用Intellij,我有一个简单的应用程序,其中包含一些对外部依赖项的调用,如slf4j
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
///
public static void main(String[] args) {
logger.debug("start");
}
}
pom.xml
包含相关的依赖项,应用程序已成功编译
当从intellij作为常规应用程序运行应用程序时,它运行没有问题
但当用它创建一个可执行jar并试图运行它时,它崩溃了,找不到外部依赖项:
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at com.example.Main.<clinit>(Main.java:18)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Exception in thread "main"
Process finished with exit code 1
我将此添加到pom以尝试解决该问题,但没有帮助:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
清单文件位于src/main/resources/META-INF/manifest中。MF:
Manifest-Version: 1.0
Main-Class: com.example.Main
# 1 楼答案
这很容易理解。您正在创建的jar只包含代码的
.class
文件,而不包含您正在导入的其他库的文件。因此,当您运行代码时,它无法找到您在代码中引用的外部库(org.slf4j
)我不知道你正在使用的maven jar插件,但是试试maven汇编插件。这个插件用于将您与代码一起使用的所有其他库捆绑起来,并创建一个“捆绑”jar。将以下内容添加到
pom.xml
。您可以在<plugins>
和</plugins>
之间添加此部分这还将这个“组装”目标绑定到maven的
package
阶段。所以mvn package
应该创建您的jar# 2 楼答案
您的meta inf应该具有以下属性 清单版本:1.0
创建人:xxxx
主类:com。样品Main
ClassPath:path/to/jars/your。jar
java-cp-yourpath/示例。JARCOM。样品Main
或
java-jar示例。jar