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
相关产品推荐
相关产品推荐

