Maven项目打包时无法识别外部system依赖Jar包问题求助
Maven项目打包时无法识别外部system依赖Jar包问题求助
嗨,我之前也踩过Maven system 依赖的坑,开发时一切正常,一打包就找不到这个外部Jar,太闹心了!这是因为system scope本来是给JDK或者系统预装的依赖设计的,Maven默认不会把这类依赖打进最终的包里面。给你几个亲测有效的解决办法:
方法一:把外部Jar安装到本地Maven仓库(最推荐)
这个方法能把外部Jar转成普通的Maven依赖,彻底解决打包问题:
- 打开终端,运行下面的命令(路径换成你项目里Jar的实际位置):
mvn install:install-file -Dfile=src/lib/Automation.BDaq.jar -DgroupId=Automation.BDaq -DartifactId=Automation.BDaq -Dversion=1.0 -Dpackaging=jar
- 然后修改pom.xml里的依赖,删掉
scope和systemPath配置,变成普通依赖:
<dependency> <groupId>Automation.BDaq</groupId> <artifactId>Automation.BDaq</artifactId> <version>1.0</version> </dependency>
这样Maven就会像处理其他公共依赖一样对待它,打包时自动包含,后续维护也更省心。如果是团队协作,还可以把这个Jar传到你们的私有Maven仓库里,其他人直接拉依赖就行。
方法二:用maven-assembly-plugin把依赖打进Jar
如果不想把Jar装到本地仓库,可以用这个插件直接把所有依赖(包括system scope的)打包成一个可执行Jar:
在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> <!-- 替换成你项目的主类全路径,比如com.xxx.YourMainClass --> <mainClass>com.yourcompany.YourMainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
配置好后,运行mvn clean package,target目录里会生成一个带-with-dependencies后缀的Jar包,这个包就包含了你的项目代码和所有依赖(包括那个外部Jar)。
方法三:用maven-shade-plugin打包依赖
这个插件和assembly类似,还能处理类名冲突等问题,适合复杂项目:
在pom.xml的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> <artifactSet> <includes> <include>Automation.BDaq:Automation.BDaq</include> </includes> </artifactSet> <archive> <manifest> <!-- 同样替换成你的主类全路径 --> <mainClass>com.yourcompany.YourMainClass</mainClass> </manifest> </archive> </configuration> </execution> </executions> </plugin>
运行mvn clean package后,生成的Jar就会包含这个外部依赖,直接运行即可。
备注:内容来源于stack exchange,提问作者M.Aslan
相关产品推荐
相关产品推荐

