天天看点

eclipse maven打包jar_Maven多模块如何打包本地的jar包到war中

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

eclipse maven打包jar_Maven多模块如何打包本地的jar包到war中

有几种方案,比如使用

${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包打包进去从而顺利运行。

继续阅读