Maven之子模块pom.xml继承父模块pom.xml配置


前言

Maven中可以通过继承父模块pom,来实现pom.xml配置的继承和传递,便于各种Maven插件以及程序依赖的统一管理。通过将子类模块的公共配置,抽象聚合生成父类模块,能够避免pom.xml的重复配置。由于父类模块本身并不包含除了POM之外的项目文件,也就不需要src/main/java之类的文件夹了。每当需要对多个子模块进行相同的配置时,只需要在父类模块的pom中进行配置,而子类中声明使用此配置即可,当然子类pom中也可以自定义配置,并覆盖父类中的各项配置,和Java中类的继承类似。


可继承的POM元素

1) groupId:项目组ID,项目坐标的核心元素

2) version:项目版本,项目坐标的核心元素

3) description:项目的表述信息

4) organization:项目的组织信息

5) inception Year:项目的创始年份

6) url:项目的URL地址

7) developers:项目的开发者信息

8) contributors:项目的贡献者信息

9) distributionManagement:项目的部署管理

10) issueManagement:项目的缺陷和跟踪系统信息

11) ciManagement:项目的持续集成信息系统

12) scm:项目的版本控制系统信息

13) mailingLists:项目的邮件列表信息

14) properties:自定义的Maven属性

15) dependencies:项目的依赖属性

16) dependencyManagement:项目的依赖管理配置

17) repositories:项目的仓库配置

18) build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

19) reporting:包括项目的报告输出目录配置、报告插件配置等


POM继承中的依赖管理和插件管理

Maven提供的dependencyManagementpluginManagement元素用于帮助POM继承过程中的依赖管理和插件管理。在父类POM下,此两个元素中的声明的依赖或配置并不会引入实际的依赖或是造成实际的插件调用行为,不过它们能够约束子类POM中的依赖和插件配置的声明。只有当子类POM中配置了真正的dependencyplugin,并且其groupIdartifactId与父类POM中dependencyManagementpluginManagement相对应时,才会进行实际的依赖引入或插件调用,当然子类中也能够进行自定义配置去覆盖父类,或是额外声明自己的配置


POM继承示例

1) 在父类POM中使用dependencyManagementpluginManagement,声明子类POM中可能用到的依赖和插件

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tomandersen</groupId>
    <artifactId>HadoopCustomModules</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>flume</module>
        <module>log-collector</module>
    </modules>

    <!--事先声明版本属性-->
    <properties>
        <slf4j.version>1.7.20</slf4j.version>
        <logback.version>1.0.7</logback.version>
    </properties>


    <!--在父类Maven中使用dependencyManagement声明依赖便于子类Module继承使用,也便于进行依赖版本控制-->
    <dependencyManagement>
        <dependencies>
            <!--阿里巴巴开源json解析框架-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.51</version>
            </dependency>

            <!--日志生成框架-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback.version}</version>
            </dependency>

            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${logback.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <build>
        <!--在父类Maven中使用pluginManagement管理插件便于子类Module继承使用,也便于进行依赖版本控制-->
        <pluginManagement>
            <plugins>
                <!--配置Maven项目compiler插件-->
                <!--此工具不会打包依赖-->
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>

				<!--配置Maven项目assembly插件-->
            	<!--此工具会将全部依赖打包-->
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                <!--子类Maven通过mainClass标签设置成主类的全类名FQCN-->
                                <!--<mainClass></mainClass>-->
                            </manifest>
                        </archive>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>
        </pluginManagement>

    </build>

2) 在子类POM中声明父类POM,并配置实际使用的dependencyplugin,只需要通过声明groupIdartifactId就可以避免配置各种依赖和插件的详细配置,当然也可以自己覆盖父类配置信息

    <!--声明父类POM-->
    <parent>
        <artifactId>HadoopCustomModules</artifactId>
        <groupId>com.tomandersen</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <!--子类POM信息-->
    <groupId>com.tomandersen</groupId>
    <artifactId>log-collector</artifactId>

    <dependencies>
        <!--阿里巴巴开源json解析框架-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>

        <!--日志生成框架-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--自定义Maven项目编译器compiler插件相关配置-->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>

            <!--自定义Maven项目汇编assembly插件相关配置-->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <!--此处设置成主类的全名-->
                            <mainClass>com.tomandersen.appclient.AppMain</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

更多详细内容可以查阅《Maven实战》


End~

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值