现如今,使用spring-boot和maven开发项目已经越来越普遍了,同时大多时候我们也是通过maven以及公共的repo和私服repo来管理自己的jar包依赖,但难免会碰到有些jar包需要放在本地,通过本地jar包的形式加载到自己的项目里。
本文主要阐述这种情况下怎么处理,项目中虽然使用的spring-boot,但是还是打包成了war包,项目结构如下
project-A //父工程
module-a //启动类模块同时也是打包模块
module-a-pom.xml //packaging为war
module-b //需要使用本地lib的模块
module-b-pom.xml
pom.xml //packaging为pom
lib //存放本地lib的目录
为了能够在部署war包后项目能够正常运行,需要做下面几件事
1. 如何在需要的模块中引用本地的包?
这里也即如何在
module-b
中引用lib目录中的jar包,如下配置
<dependency>
<groupId>your.package.groupId</groupId>
<artifactId>your.package.artifactId</artifactId>
<version>your.package.artifactId</version>
<scope>system</scope>
<systemPath>${basedir}/../libs/your-package.jar</systemPath>
</dependency>
上述中,前三个和我们正常的maven配置一样,这需要注意的就是
<systemPath>
配置了,需要使用
绝对路径,指向你的本地jar包路径,
${basedir}
表示项目根目录,
但是这里的根目录并不是我所想的父模块的目录(即project-A
目录路径)而是该pom所在的模块的目录(即 module-b
目录) ,
${basedir}
代表的应该是本pom所在的模块对应的目录,所以我们需要使用
../
来找到对应的jar包。为了解决这个问题,自己google了下:
how to get the super pom basedir in a child module pom?stackoverflow.com
有几种方案,比如使用
${project.parent.basedir}
或者在父pom中定义
<rootPath> ${basedir} </rootPath>
然后在子pom中使用
${rooPath}
本人实践均无效。
2. 如何将本地的jar包打包进项目的war包?
按照1中配置完后编译没有问题,但是运行则报错,发现本地的lib并没有打包到war包中
WEB-INF/lib
目录里,我们还需要在启动模块进行配置,这里即
module-a
模块,如下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<!-- 下面是为了将本地jar包打入WEB-INF/lib下而增加的配置-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<!-- 指向的是包含所有要用jar包的目录 -->
<directory>${basedir}/../libs</directory>
<!-- 编译后要把这些jar包复制到的位置 -->
<targetPath>WEB-INF/lib</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
这里需要配置两个地方
-
插件配置spring-boot-maven-plugin
<includeSystemScope>true</includeSystemScope>
- 增加
插件,这里的maven-war-plugin
也需要按照1中方法正确指向你的本地jar包所在的目录<directory>
至此,便可以在spring-boot的war包中将本地的jar包打包进去从而顺利运行。