Maven生成含依赖与测试的Jar包:报错及依赖缺失问题
搞定Maven打包可运行Jar的那些问题
看起来你在打包LeanFT测试项目时遇到了两个头疼的问题:先是用maven-jar-plugin打包报错,后来换了maven-assembly-plugin虽然生成了Jar,但运行时缺依赖。我来一步步帮你解决:
1. 先解决第一个报错:repository element was not specified in the POM inside distribution
这个错误其实是执行mvn deploy命令才会触发的——因为deploy需要把你的Jar上传到远程仓库,但你的pom里没配置<distributionManagement>节点来指定仓库地址。
如果你的目标只是生成可运行Jar,完全不用管这个错误,只要执行mvn package而不是mvn deploy就行。要是以后真需要部署到远程仓库,再给pom加个distributionManagement配置就行,现在先专注打包的核心需求。
2. 解决依赖没打包进Jar的问题
你用的maven-assembly-plugin没生效,主要是两个原因:
- 默认不会包含system scope的依赖(就是你本地的LeanFT SDK那些Jar)
- 没把插件绑定到Maven的
package生命周期,得手动执行特殊命令才会生成带依赖的Jar
给你一套完整的assembly插件配置
把你原来的assembly插件替换成下面的代码,它会帮你搞定所有问题:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <!-- 用最新稳定版,避免旧版本的bug --> <configuration> <archive> <manifest> <mainClass>test.LeanFTest</mainClass> <!-- 保持你的主类配置 --> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 关键:强制包含system scope的LeanFT依赖 --> <includeScope>system</includeScope> <!-- 如果需要排除log4j.properties,取消下面这段注释 --> <!-- <excludes> <exclude>**/log4j.properties</exclude> </excludes> --> </configuration> <executions> <execution> <id>build-fat-jar</id> <phase>package</phase> <!-- 绑定到package阶段,执行mvn package自动生成 --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
打包步骤
- 先清理之前的编译产物:
mvn clean - 执行打包:
mvn package - 去
target目录找生成的Jar,名字应该是LeanFT-1.0-SNAPSHOT-jar-with-dependencies.jar,这个就是包含所有依赖的可运行Jar
额外检查点
- 确认你的主类
test.LeanFTest确实在src/main/java/test/LeanFTest.java路径下,类名和包名要完全匹配 - 如果
log4j.properties在src/main/resources里,默认会被打包进去;要是你确实需要排除,就把上面配置里的注释去掉
3. 备选方案:用maven-shade-plugin打包
要是assembly插件还是有问题,试试maven-shade-plugin,它对system依赖的处理更灵活,配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>test.LeanFTest</mainClass> </transformer> </transformers> <!-- 显式指定要包含的依赖,包括system scope的LeanFT包 --> <artifactSet> <includes> <include>com.hp.lft:*</include> <include>log4j:*</include> <include>org.testng:*</include> <include>org.hamcrest:*</include> <include>commons-io:*</include> </includes> </artifactSet> </configuration> </execution> </executions> </plugin>
用这个插件的话,执行mvn clean package后,target目录下的LeanFT-1.0-SNAPSHOT.jar就是带所有依赖的可运行Jar,直接运行就行。
内容的提问来源于stack exchange,提问作者plaidshirt
相关产品推荐
相关产品推荐

