Maven 父子项目

2023-10-16 19:13:39 浏览数 (1)

1、创建父项目

cmd进入项目工作目录,执行以下代码:

代码语言:javascript复制
mvn archetype:generate

 创建成功,接着修改pom.xml如下:

代码语言:javascript复制
<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>testparentgroupid</groupId>
  <artifactId>testparentartifactId</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>testparentartifactId</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

注:修改packageing打包方式为pom,父项目的packageing设置为pom,才能去管理其他工程.

2、父项目创建子项目

cmd进入父项目pom.xml所在的目录,执行构建代码如下:

代码语言:javascript复制
mvn archetype:generate

 子项目创建成功,此时Maven修改了父项目的pom.xml内容如下:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>testparentgroupid</groupId>
  <artifactId>testparentartifactId</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>testparentartifactId</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
<modules>  <module>testchild1artifactId</module>
  </modules>
</project>

新增了modles节点,将子项目包含到了里面.建立了父项目与子项目的关联.通过modles节点,子项目的pom.xml内容如下:

代码语言:javascript复制
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>testparentgroupid</groupId>
    <artifactId>testparentartifactId</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>testchild1groupId</groupId>
  <artifactId>testchild1artifactId</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>testchild1artifactId</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

可以看到新生成了一个parent节点,Maven自动建立了子项目父项目的关联通过parent节点.

注:如果子项目和父项目的groupId和version一样,一般情况下是一样的.这两个属性可以删除,只保留artifactId,所以修改子项目pom如下:

代码语言:javascript复制
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>testparentgroupid</groupId>
    <artifactId>testparentartifactId</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>testchild1artifactId</artifactId>
  <name>testchild1artifactId</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

到这里,父子项目已经建立了关联

3、父项目管理所有依赖信息

修改父项目的pom.xml,如下:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>testparentgroupid</groupId>
  <artifactId>testparentartifactId</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>testparentartifactId</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.0.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>4.0.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.0.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  
  <modules>  
    <module>testchild1artifactId</module>
  </modules>
</project>

父项目通过dependencyManagement节点引入了一系列的sping框架依赖.注意这里只是一个列表而已,不会真正的去下载这些依赖.可以通过cmd进入父项目的pom.xml,执行如下代码:

代码语言:javascript复制
mvn dependency:list

可以发现父项目没有去执行任何下载包的操作

修改子项目的pom.xml如下:

代码语言:javascript复制
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>tpgroupId</groupId>
    <artifactId>tpartifactId</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>tpchild1groupId</groupId>
  <artifactId>tpchild1artifactId</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>tpchild1artifactId</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
 <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
      </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

这里添加了spring-aop的依赖.因为本地maven仓库和相关仓库没有,所以如下图

 执行了相关下载.同时在切换为父项目查看依赖,cmd进入父项目的pom.xml目录,执行如下代码:

代码语言:javascript复制
mvn dependency:list

 父项目依然没有依赖.

到这里,可以菜刀父项目提供了一个依赖列表,其提供了依赖默认的版本,可以在子项目中不指定依赖的版本,而采用父项目的版本,因为上面的子项目并没有指定spring-aop的具体版本,但是却下载了父项目中的spring-aop的版本.所以pom项目有一定的版本管理功能,version遵循以下规律:

(1)、父项目已经引入的依赖,子项目可以不用写version ,此时子项目采用父项目的version

(2)、如果子项目写了version和父项目的version不一致,采用子项目的version

4、查看子项目的依赖层级

cmd进入指定子项目的pom.xml,执行如下代码:

代码语言:javascript复制
mvn dependency:tree

5、父项目升级管理的所有依赖项的版本

修改父项目的pom.xml如下:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>tpgroupId</groupId>
  <artifactId>tpartifactId</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>tpartifactId</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.1.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.1.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.1.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>4.1.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.1.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <modules>
    <module>tpchild1artifactId</module>
  </modules>
</project>

升级spring相关项目的版本到4.1.0,接着cmd进入子项目的pom.xml所在的目录执行如下代码:

代码语言:javascript复制
mvn dependency:list

 可以看到下载了4.1.0相关的包,依赖解析结果也显示升级到了4.1.0相关的版本,再看下本地Maven仓库

 4.0.0和4.1.0都存在于仓库中

6、父子项目添加自定义属性,控制pom中的相关配置

修改父项目pom.xml如下:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>tpgroupId</groupId>
  <artifactId>tpartifactId</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>tpartifactId</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <custome.spring.version>4.2.0.RELEASE</custome.spring.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${custome.spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${custome.spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${custome.spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>${custome.spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${custome.spring.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <modules>
    <module>tpchild1artifactId</module>
  </modules>
</project>

这里在properties节点下新增了custome.spring.version节点,并修改了依赖列表中所有spring相关项目的version节点为 <version>${custome.spring.version}</version>

接着cmd定位到父项目所在的pom.xml,执行如下代码:

代码语言:javascript复制
mvn dependency:list

 可以看到子项目开始下载4.2.0版本的相关包.说明自定义属性配置成功,这里也可以在子项目的pom.xml中配置自定义属性.并不是只能在父项目中配置

0 人点赞