maven子pom没有继承到父pom依赖版本

/ maven / 没有评论 / 1824浏览

Java项目很多都会有子module,一般父项目没有逻辑代码,在父项目pom.xml中注明依赖、version和其他一些公用的东西,子module的pom继承父pom,子pom就不用写依赖的版本了,但至少也要写用到依赖的groupId、artifactId,这样默认会使用父项目依赖的版本。子pom也可以写版本,这样就不受父pom影响了,和继承类似,但还是有些区别。

使用时需要注意,我就是忘了其中一项,没有生效:

dependencyManagement:像上面提到的,一般在父项目中会声明这个元素,和普通依赖用法类似,这个元素并不会真的引入依赖,只会标明依赖和版本,子项目会从父项目找<dependencyManagement>从而确定需要引用依赖版本,类似于模板模式。

父pom例子:

  <!-- 省略无关配置 -->
  <packaging>pom</packaging>

    <modules>
        <!-- 注明所有子module -->
        <module>module1</module>
        <module>module2</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <!-- 以Lombk为例 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.8</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!-- 省略无关配置 -->
    <parent>
        <groupId>父项目group</groupId>
        <artifactId>父项目artifactId</artifactId>
        <version>父项目version</version>
      	<relativePath>../pom.xml</relativePath>
    </parent>
    <dependencies>
        <!--这样会使用父pom中的依赖版本1.18.8,如果这里写version就不会使用父pom里的版本了-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

relativePath

  1. 指定查找该父项目pom.xml的(相对)路径。默认顺序:relativePath > 本地仓库 > 远程仓库
  2. 没有relativePath标签等同…/pom.xml, 即默认从当前pom文件的上一级目录找
  3. 表示不从relativePath找, 直接从本地仓库找,找不到再从远程仓库找

经过 maven3.6版本测试,似乎没有relativePath标签时,它没有从当前pom文件的上一级目录找,子模块继承不到父模块中dependencyManagement中包的version信息。子模块想要用父模块pom中的版本,请注意配置relativePath属性!