一、问题描述
一个基于SpringBoot的父子工程项目, 在external-libs文件夹里引入了几个甲方提供的jar文件(这样做是由于不让把这些jar文件放入Maven仓库管理),然后在common模块的pom里使用了<scope>system</scope>去引用,如下图所示。本地启动一切正常,打成可执行jar包后就运行报错找不到引入的那些类文件。
1. 项目结构
2. common包中的pom文件
二、问题解决
1. 解决思路
使用<scope>和<systemPath>在本地启动完全没问题,但是打成可执行的jar包在测试环境以jar包方式运行就报错,并且是报错找不到刚刚引入的包里的文件,这样首先就应该想到,大概率问题就出在了打包的环节,Maven在打包时没有把external-libs里的jar文件连同pom里引入的其他的在仓库中管理的jar文件一起打入最终的可执行jar包。这样问题就好办了,可以百度,或者把问题描述清楚给ChatGPT,去找到解决方案。
2. 解决办法
如下,在admin模块(启动类所在的模块)的pom文件里利用maven-resources-plugin插件自定义配置Maven的打包过程
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<!--将scope为system的jar包打包进可执行jar包-->
<execution>
<id>copy-jars</id>
<!--指定在 Maven 构建过程中的 prepare-package 阶段执行-->
<phase>prepare-package</phase>
<goals>
<!--指定需要完成的具体任务-->
<goal>copy-resources</goal>
</goals>
<!--配置插件执行的具体参数,包括输入输出目录、文件过滤规则、资源过滤规则等等-->
<configuration>
<!--指定输出目录(以下目录就是打包后的可执行jar包里的依赖目录)-->
<outputDirectory>${project.build.outputDirectory}/BOOT-INF/lib</outputDirectory>
<!--定义要复制的资源文件-->
<resources>
<resource>
<directory>${project.basedir}/../external-libs</directory>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</build>
<!--其他内容此处省略-->