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

Maven导出Jar找不到Logstash依赖,但运行主类正常求助

问题描述

为了将日志编码为JSON,我在项目中添加了以下Maven依赖:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.2</version>
</dependency>
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.6.1</version>
</dependency>

在IntelliJ中重新加载Maven后,运行主类时能正常使用这些依赖,但执行 mvn clean install -DskipTests 导出Jar包并运行时,出现如下错误:

2023-01-11 13:07:54 13:07:54,863 |-ERROR in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Could not create component [encoder] of type [net.logstash.logback.encoder.LogstashEncoder] java.lang.ClassNotFoundException: net.logstash.logback.encoder.LogstashEncoder

请问为何导出的Jar包会提示找不到该依赖,而运行主类时却能正常使用?


原因分析与解决方案

核心原因

IntelliJ运行主类时,会自动把Maven本地仓库里的所有相关依赖Jar加入运行类路径,所以能找到LogstashEncoder这类第三方类;但默认Maven打包生成的Jar包只包含项目自身代码,不会自动把第三方依赖打包进去,运行时自然找不到这些类。

解决办法

你需要通过Maven插件配置,把第三方依赖打包进最终的Jar包,常用的有两种方案:

方案1:使用maven-assembly-plugin

在项目的pom.xml中添加以下插件配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <!-- 替换成你项目主类的全限定类名 -->
                        <mainClass>com.your.package.YourMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置完成后执行 mvn clean package -DskipTests,打包后会在target目录下生成两个Jar包,其中带-jar-with-dependencies后缀的就是包含所有依赖的可执行Jar,直接运行这个Jar即可。

方案2:使用maven-shade-plugin

另一个常用的打包插件是maven-shade-plugin,配置示例如下:

<build>
    <plugins>
        <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>com.your.package.YourMainClass</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

执行mvn clean package -DskipTests后,生成的Jar包已经包含所有依赖,直接运行即可。

补充提示

如果你的项目是Spring Boot项目,不用额外配置插件,直接用Spring Boot自带的spring-boot-maven-plugin,它会自动打包成包含所有依赖的可执行Jar。


内容的提问来源于stack exchange,提问作者marialadelbario

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:35:20