You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:39