当前位置: 移动技术网 > IT编程>开发语言>Java > Maven项目继承实现过程图解

Maven项目继承实现过程图解

2020年08月06日  | 移动技术网IT编程  | 我要评论
多个maven项目之间难免有重复的pom配置,重复的配置没必要重复写,maven提供了父子继承的关系,重复的依赖直接放在父项目的pom中。所以不希望每个开发者随意定义maven版本依赖,可以在父项目中

多个maven项目之间难免有重复的pom配置,重复的配置没必要重复写,maven提供了父子继承的关系,重复的依赖直接放在父项目的pom中。

所以不希望每个开发者随意定义maven版本依赖,可以在父项目中进行说明,然后子项目沿用即可。

idea创建父项目(这是一个父项目,也是一个空项目,只需要pom.xml,编写相关的依赖, 父项目必须用pom打包的方式):

编辑父项目pom.xml

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
     xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>

  <groupid>com.linewell</groupid>
  <artifactid>maven-parent</artifactid>
  <version>1.0-snapshot</version>
  <!--父项目必须是pom-->
  <packaging>pom</packaging>

  <!--定义参数-->
  <properties>
    <common.version>2.6</common.version>
    <spring.version>4.3.6.release</spring.version>
  </properties>

  <!--这边的依赖子项目会继承-->
  <dependencies>
    <dependency>
      <groupid>commons-io</groupid>
      <artifactid>commons-io</artifactid>
      <version>${common.version}</version>
    </dependency>
  </dependencies>

  <dependencymanagement>
    <dependencies>
      <dependency>
        <groupid>spring-context-support</groupid>
        <artifactid>org.springframework</artifactid>
        <version>${spring.version}</version>
      </dependency>
    </dependencies>
  </dependencymanagement>
  
</project>

这边需要说明下,dependencymanagement,这边的依赖不会被继承,如果子项目导入了这个依赖,可以不用写版本号,会以父项目的为主,因为有的子项目不一定会用父项目中的所有依赖。个别子项目依赖到的包可以放在这里,然后不需要写版本号,会自动引用父项目。

创建一个子项目,编辑子项目的pom.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
     xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>

  <groupid>com.linewell</groupid>
  <artifactid>maven-children</artifactid>
  <version>1.0-snapshot</version>

  <parent>
    <groupid>com.linewell</groupid>
    <artifactid>maven-parent</artifactid>
    <version>1.0-snapshot</version>
    <relativepath>../mavenparent/pom.xml</relativepath>
  </parent>

</project>

可以看到commons-io进来了,spring-context-support没进来。

我现在不添加spring-context-support的版本,然后看下结果,是会以父项目的版本为主。可以看到如下引入的也是父项目中的4.3.6

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
     xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>

  <parent>
    <groupid>com.linewell</groupid>
    <artifactid>maven-parent</artifactid>
    <version>1.0-snapshot</version>
    <relativepath>../mavenparent/pom.xml</relativepath>
  </parent>

  <groupid>com.linewell</groupid>
  <artifactid>maven-children</artifactid>
  <version>1.0-snapshot</version>

  <dependencies>
    <dependency>
      <groupid>org.springframework</groupid>
      <artifactid>spring-context-support</artifactid>
    </dependency>
  </dependencies>
</project>

那么问题来了,如果子项目指定了版本会怎么样?

编辑子项目pom.xml, 如下可以发现,如果子项目有明确指定依赖以及具体版本,与父项目发生冲突会以子项目的依赖为准。

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
     xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>

  <parent>
    <groupid>com.linewell</groupid>
    <artifactid>maven-parent</artifactid>
    <version>1.0-snapshot</version>
    <relativepath>../mavenparent/pom.xml</relativepath>
  </parent>

  <groupid>com.linewell</groupid>
  <artifactid>maven-children</artifactid>
  <version>1.0-snapshot</version>

  <dependencies>
    <dependency>
      <groupid>commons-io</groupid>
      <artifactid>commons-io</artifactid>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupid>org.springframework</groupid>
      <artifactid>spring-context-support</artifactid>
      <version>5.2.5.release</version>
    </dependency>
  </dependencies>

</project>

ps:如果父项目中执行了mvn install安装到了本地仓库,然后子项目中引入父gav的时候可以不用写路径relativepath属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网