美文网首页
maven父子项目引用(继承和聚合)

maven父子项目引用(继承和聚合)

作者: 晓晓_1931 | 来源:发表于2022-12-19 17:11 被阅读0次

    一、继承方式

    分别创建三个项目fu、ca、cb。fu作为父项目,ca、cb、cp作为子项目

    fu创建时打包方式为pom;
    ca、cb创建时打包方式为jar;
    cp创建时打包方式为war(主要看插件是否也跟着继承过来)

    fu项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.xx</groupId>
        <artifactId>fu</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging><!-- 打包方式为pom -->
        <!-- 统一管理子项目的jar包,用 <dependencyManagement> -->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                    <version>2.3</version>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    
        <build>
           <!-- 统一管理子项目的插件,用 <pluginManagement> -->
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.3.1</version> <!-- 需要带版本号 -->
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    

    ca项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <groupId>com.xx</groupId>
            <artifactId>fu</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <relativePath>../pom.xml</relativePath> <!--本例中此处是可选的-->
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>ca</artifactId>
    
        <dependencies>
            <!-- 父项目用了 <dependencyManagement> 所以
            子项目这块需要手动引入一下相同的jar,但是不需要写版本号,写版本号就以子的本版为准-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId> 
                <!--此处不再需要verison了!-->
            </dependency>
            <dependency>
                <!--当然也可以加入只在这个子模块中用到的jar包-->
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-core-lgpl</artifactId>
                <version>1.9.4</version> 
            </dependency>
        </dependencies>
    </project>
    

    cb项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
        
        <parent>
            <groupId>com.xx</groupId>
            <artifactId>fu</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <relativePath>../pom.xml</relativePath> <!--本例中此处是可选的-->
        </parent>
        
        <modelVersion>4.0.0</modelVersion> 
        <artifactId>cb</artifactId> 
    
        <dependencies>
            <dependency> 
                <groupId>com.xx</groupId>
                <artifactId>ca</artifactId> <!--加上ca的所有依赖,需要install项目ca-->
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </project>
    

    cp项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <groupId>com.xx</groupId>
            <artifactId>fu</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <relativePath>../pom.xml</relativePath> <!--本例中此处是可选的-->
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>cp</artifactId>
        <packaging>war</packaging>
        <!-- 插件就不需要引入了 -->
    </project>
    

    二、聚合方式

    分别创建三个项目fuproject、cap、cbp、cpp。fuproject作为父项目,cap、cbp、cpp作为子模块

    fu创建时打包方式为pom;
    cap、cbp创建时打包方式为jar;
    cpp创建时打包方式为war(主要看插件是否也跟着继承过来)

    fuproject项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.xx</groupId>
        <artifactId>fuproject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <modules>
            <module>cap</module>
            <module>cbp</module>
            <module>cpp</module>
        </modules>
    
        <dependencies>
            <dependency>
                <!--添加一个jar包依赖-->
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.3.1</version>
                </plugin>
            </plugins>
        </build>
    </project>
    

    cap项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <!-- 引入父坐标 -->
      <parent>
        <groupId>com.xx</groupId>
        <artifactId>fuproject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </parent>
      <!-- 自己的坐标 -->
      <artifactId>cap</artifactId>
      <dependencies>
     <!--  
       <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>    
            <version>2.5</version>
       </dependency> 
     -->
       <!-- 父项没用 <dependencyManagement> 所以 子项目这块可以不写,但是也会被引入,
            如果写了,版本号以子项目的为主-->
       <dependency>
           <!--当然也可以加入只在这个子模块中用到的jar包-->
           <groupId>org.codehaus.jackson</groupId>
           <artifactId>jackson-core-lgpl</artifactId>
           <version>1.9.4</version>    
       </dependency>
      </dependencies>
    </project>
    

    cbp项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <!-- 引入父坐标 -->
        <parent>
            <groupId>com.xx</groupId>
            <artifactId>fuproject</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent>
        <!-- 自己的坐标 -->
        <artifactId>cbp</artifactId>
        <dependencies>
            <dependency>
                <groupId>com.xx</groupId>
                <artifactId>cap</artifactId> <!--加上cap的所有依赖,需要install项目cap-->
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </project>
    

    cpp项目的pom.xml

    <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 
    https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
      <!-- 引入父坐标 -->
      <parent>
        <groupId>com.xx</groupId>
        <artifactId>fuproject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </parent>
      <!-- 自己的坐标 -->
      <artifactId>cpp</artifactId>
      <packaging>war</packaging>
      <!-- 插件就不需要引入了 -->
    </project>
    

    注意:

    1、无论继承还是聚合

    如果父pom中使用的是
    <dependencies>....</dependencies>
    的方式,则子pom会自动使用pom中的jar包;

    如果父pom使用
    <dependencyManagement>
    <dependencies>....</dependencies>
    </dependencyManagement>
    方式,则子pom不会自动使用父pom中的jar包,这时如果子pom想使用的话,就要给出groupId和artifactId,无需给出version

    2、"聚合"在读取父的pom文件时去找到子项目的pom,但还是会分别去编译他们引入的依赖。这样就会导致pom文件引入的包重复!!于是我们引入了"继承"的概念,也就是形成"父子"关系,子pom可以引用到父pom中引入的依赖。

    相关文章

      网友评论

          本文标题:maven父子项目引用(继承和聚合)

          本文链接:https://www.haomeiwen.com/subject/fiiyqdtx.html