Maven- 聚合与继承

  1. 聚合:
    实现一次构建多个项目, 而不是到两个模块的目录下分别执行 mvn 命令. 创建一个额外的模块, 然后通过该模块构件整个项目的所有模块.

    <?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>study.maven</groupId>
        <artifactId>maven-aggregator</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--这里和一般项目的不一样-->
        <packaging>pom</packaging>
        <name>Aggregator</name>
        <modules>
            <!--这里是需要一次构建的模块-->
            <module>study-email</module>
            <module>study-persist</module>
        </modules>
    </project>    
    

    通常将聚合模块放在项目目录的最顶层, 其它模块则作为聚合模块的子目录存在.

  2. 继承:
    父 pom 的 packaging 也为 pom. 父模块本身不包含除 pom 之外的项目文件, 也就不需要 src/main/java/

    <!--父 pom-->
    <?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>study.maven</groupId>
        <artifactId>maven-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--这里和一般项目的不一样-->
        <packaging>pom</packaging>
        <name>Parent</name>
    </project> 
    
    <!--子 pom-->
    <?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>
        <!--这里引用 pom-->
        <parent>
            <groupId>study.maven</groupId>
            <artifactId>maven-parent</artifactId>
            <version>1.0-SNAPSHOT</version>
            <!--这个路径配置比较重要-->
            <relativePath>../maven-parent/pom.xml</relativePath>
        </parent>
        <!--这里不用为子 pom 声明 groupId 和 version, 它们从父 pom 中继承-->
        <artifactId>study-email</artifactId>
        <name>email</name>
    </project> 
    

    正确设置 relativePath 非常重要. 对于一个包含父子模块关系的 Maven 项目, 由于只想构建单独的一个模块. 如果此时父模块没有被安装到本地仓库, 并且子模块的 relativePath 没有被正确设置. 此时 Maven 将无法找到父 pom 导致构建失败. 如果 Maven 能够根据 relativePath 找到父 pom, 它就不要再去检查本地仓库.

     可以继承的 pom 元素:
         * groupId: 项目组 ID
         * version: 项目版本
         * description: 项目的描述信息
         * organization: 项目的组织信息
         * inceptionYear: 项目的创始年份
         * url: 项目的 URL 地址
         * developers: 项目的开发者信息
         * contributors: 项目的贡献者信息
         * distributionManagement: 项目的不熟配置
         * issueManagement: 项目的缺项跟踪系统信息
         * ciManagement: 项目的持续继承系统信息
         * scm: 项目的版本控制系统信息
         * mailingLists: 项目的邮件列表信息
         * properties: 自定义的 Maven 信息
         * dependencies: 项目的依赖配置
         * dependencyManagement: 项目的依赖管理配置
         * repositories: 项目的仓库配置
         * build: 项目的源码目录配置, 输出目录配置, 插件配置, 插件管理配置
         * reporting: 项目的报告输出目录配置, 报告插件配置
    
  3. 依赖管理:
    Maven 提供的 dependencyManagement 元素既能让子模块继承到父模块的依赖配置, 又能保证子模块依赖使用的灵活性. 在 dependencyManagement 元素下的依赖声明不回引入实际的依赖, 不过它能够约束 dependencies 下的依赖使用.

    <!--父 pom-->
    <?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>study.maven</groupId>
        <artifactId>maven-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--这里和一般项目的不一样-->
        <packaging>pom</packaging>
        <name>Parent</name>
        <properties>
            <springframework.version>2.5.6</springframework.version>
            <junit.version>4.7</junit.version>
        </properties>
        <!--这里使用 dependencyManagement 声明的依赖既不会给 maven-parent 引入依赖, 也不会给它的子模块引入依赖, 不过这段配置是会被继承的-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                    <version>${springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                    <version>${springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>${springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context-support</artifactId>
                    <version>${springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project> 
    
    <!--子 pom 文件-->
    <?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>
        <!--这里引用 pom-->
        <parent>
            <groupId>study.maven</groupId>
            <artifactId>maven-parent</artifactId>
            <version>1.0-SNAPSHOT</version>
            <!--这个路径配置比较重要-->
            <relativePath>../maven-parent/pom.xml</relativePath>
        </parent>
        <!--这里不用为子 pom 声明 groupId 和 version, 它们从父 pom 中继承-->
        <artifactId>study-email</artifactId>
        <name>email</name>
        <properties>
            <javax.mail.version>1.4.1</javax.mail.version>
            <greenmail.version>1.3.1.b</greenmail.version>
        </properties>
        
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
                <version>${javax.mail.version}</version>
            </dependency>
            <dependency>
                <groupId>com.icegreen</groupId>
                <atifactId>greenmail</artifactId>
                <version>${greenmail.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project> 
    
    <!--若某个模块需要使用和另一个模块完全一样的 dependencyManagement 配置-->
    <dependencyManagement>
        <dependencies>
            <groupId>study.maven</groupId>
            <artifactId>maven-parent</artifactId>
            <version>1/0-SNAPSHOT</version>
            <type>pom</type>
            <!--注意这里-->
            <scope>import</scope>
        </dependencies>
    </dependencyManagement>
    
  4. 插件管理:

        <!--父 pom-->
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>2.1.1</version>
                        <executions>
                            <execution>
                                <id>attach-source</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            <execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
        
        <!--子 pom-->
        <build>
            <plugins>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
            </plugins>
        </build>
    
  5. 聚合与继承的关系:
    对于聚合模块来说, 它知道哪些被聚合的模块, 但哪些被聚合的模块不知道这个聚合模块的存在; 对于继承关系的父 pom 来说, 它不知道有哪些子模块继承于它, 但那些子模块都必须知道自己的父 pom 是什么.

  6. 反应堆:

    • 构建顺序: Maven 按序读取 pom, 如果该 pom 没有依赖模块, 那么就构建该模块, 否则就先构建其依赖模块. 如果该依赖还依赖于其它模块, 则进一步先构建依赖的依赖.
    • 裁剪:
      • -am: 同时构建所列模块的依赖模块. 例如: mvn clean install -pl study-mail -am. 由于study-mail 依赖于 maven-parent, 所以 maven-parent 也会被构建.
      • -amd: 同时构建依赖于所列模块的模块. 例如: mvn clean install -pl maven-parent -amd. 由于 study-mail 和 study-persisit 都依赖于 maven-parent, 所以这两个模块都会被构建.
      • pl: 构建制定的模块, 模块剑用逗号分隔开. 例如: mvn clean install -pl study-mail,study-persist
      • -rf: 从完整的构建顺序中, 指定从哪个模块开始构建, 该模块及其以后的模块都会按照顺序被构建. 例如: mvn clean install -rf study-email, 则 study-email, study-persist 模块都会被构建.
  7. 参考:
    [1] : Maven 实战

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值