现如今,使用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


ieda maven打成war包 maven怎么打包成war包_maven 打包指定模块命令


有几种方案,比如使用${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插件,这里的<directory>也需要按照1中方法正确指向你的本地jar包所在的目录

至此,便可以在spring-boot的war包中将本地的jar包打包进去从而顺利运行。