Maven生成Jar包后运行报错:NoClassDefFoundError: log4j/Logger
解决Maven打包Jar后运行出现NoClassDefFoundError的问题
这个问题挺常见的——你在IntelliJ里能正常运行,是因为IDE会自动把所有依赖的库(比如log4j)都加到运行时的类路径里,但Maven默认生成的Jar包只包含你自己写的代码,不会把依赖的第三方库打包进去,所以运行时就找不到org.apache.log4j.Logger这个类了。
给你几个靠谱的解决方案:
方法一:用Maven Assembly Plugin打包包含依赖的可执行Jar
在你的pom.xml的<build><plugins>里添加这个插件配置,它会把所有依赖和你的代码打包成一个可执行的Jar:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <!-- 指定你的主类全限定名,比如com.example.YourMainClass --> <archive> <manifest> <mainClass>你的主类全限定名</mainClass> </manifest> </archive> <descriptorRefs> <!-- 这个描述符会自动把所有依赖打包进去 --> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
配置完之后,执行mvn clean package,target目录里会生成两个Jar:一个是普通的Jar,另一个是带-jar-with-dependencies后缀的可执行Jar,运行这个Jar就可以了:
java -jar your-project-name-xxx-jar-with-dependencies.jar
方法二:用Maven Shade Plugin(更灵活的打包方式)
Shade插件比Assembly更强大,能处理依赖冲突、重命名包等场景,配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 同样指定主类全限定名 --> <mainClass>你的主类全限定名</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
执行mvn clean package后,target里的主Jar就是包含所有依赖的可执行Jar,直接用java -jar命令运行即可。
额外检查点
- 确认你的log4j依赖是
compile范围(默认就是这个范围,除非你手动修改过),如果是provided或test范围,Maven不会把它打包到最终Jar里:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <!-- 确保这里没有写<scope>provided</scope>或<scope>test</scope> --> </dependency>
内容的提问来源于stack exchange,提问作者plaidshirt
相关产品推荐
相关产品推荐

