六. 聚合与继承
1.背景 Maven的聚合特性能够把项目的各个模块聚合在一起构建,而Maven的继承特性则能帮助抽取各个模块相同的依赖和插件等配置。在简化POM的同时,还能促进各个模块配置的一致性。 一般来说,一个项目的子模块都应该使用同样的groupId,如果它们一起开发和发布,还应该使用同样的version,此外,它们的atrifactId还应该使用一致的前缀,以方便区分其他项目。 项目主代码:src/main/java 项目资源文件:src/main/resources 测试代码:src/test/java 测试资源文件:src/test/resources 2.聚合 一次构建两个项目,而不是到两个模块的目录下分别执行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>com.gqshao.myapp</groupId> <artifactId>aggregator</artifactId> <version>1.0.0-SNAPSHOT</version> <name>Project Aggregator</name> <packaging>pom</packaging> <modules> <module>project-a</module> <module>project-b</module> </modules> </project> (1)上述POM中groupId、version与其他项目相同,artifactId不同; (2)packaging:必须采用特殊的pom,而不是不进行声明,采用默认的jar。对于聚合模块来说,其打包方式packaging的值必须为pom,否则无法构建; (3)modules:是实现聚合的最核心配置,这里每个module的值都是一个当前POM的相对目录,推荐模块所处目录名称应当与其artifactId一致; (4)为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在; (5)可以采用平行的目录结构,此时聚合模块的POM应该修改为<module>../project-a</module> 在执行mvn clean package命令后,Maven会首先解析聚合模块的POM、分析要构建的模块、并计算出一个反应堆构建顺序(Reactor Build Order),然后根据这个顺序依次构建各个模块。反应堆是所有模块组成的一个构建结构。 反应堆构建顺序描述输出的是各模块的名称,而不是artifactId,所以在POM配置合理的name字段,其目的是让Maven的构建输出更清晰。 3.继承 背景:多个模块的pom.xml中有很多相同的配置,例如它们有相同的groupId和version,有相同的spring-core、spring-beans,还有相同的maven-compiler-plugin等配置。 在aggregator下创建parent子目录,然后在该目录下建立一个所有除aggregator之外模块的父模块。为此在parent目录下创建pom.xml,内容如下: <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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> <groupId>com.gqshao.myapp</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <name>parent</name> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project> 该POM十分简单,使用了与其他模块一直的groupId和version,使用artifactId为parent表示这是一个父模块,作为父模块,其打包类型也必须为pom 由于父模块只是为了帮助消除配置的重复,因此它本身不包含除POM之外的项目文件,也就不需要src/main/java之类的文件夹了。 让其它模块继承它,project-a和project-b的POM修改类似于下面这种形式 <?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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>com.gqshao.myapp</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../parent或../parent/pom.xml</relativePath> </parent> <artifactId>project-a或project-b</artifactId> <name>project-a</name> <dependencies> ... </dependencies> <build> <plugins> ... </plugins> </build> </project> 上述POM中使用parent元素声明父模块,parent下的子元素gourpId、artifactId和version指定了父模块的坐标,这三个元素是必须的。元素relativePath为../parent/(可以不写pom.xml,默认值../pom.xml),也就是说Maven默认父POM在上一层目录下。 最后,同样还需要把parent加入到聚合模块aggregator中 <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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> <groupId>com.gqshao.myapp</groupId> <artifactId>aggregator</artifactId> <version>1.0-SNAPSHOT</version> <name>aggregator</name> <url>http://maven.apache.org</url> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <modules> <module>parent</module> <module>project-a</module> <module>project-b</module> </modules> </project> (2)可继承的元素 (1)groupId:项目组ID,项目坐标的核心元素; (2)version:项目版本,项目坐标的核心元素; (3)description:项目的描述信息; (4)organization:项目的组织信息; (5)inceptionYear:项目的创伤年份; (6)url:项目的URL地址; (7)developers:项目的开发者信息; (8)contributors:项目的贡献值信息; (9)distributionManagement:项目的部署配置; (10)issueManagement:项目的缺陷跟踪系统信息; (11)ciManagement:项目的持续集成系统信息; (12)scm:项目的版本控制系统信息; (13)mailingLists:项目的邮件列表信息; (14)properties:自定义的属性,重要; (15)dependency:项目的依赖配置,重要; (16)dependencyManagement:项目的依赖管理配置,重要; (17)repositories:项目的仓库配置; (18)build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等,重要; (19)reporting:包括项目的报告输出目录配置、报告插件配置等。 (3)依赖管理 Maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。 <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://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> <groupId>com.gqshao.myapp</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <name>parent</name> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <springframework.version>2.5.6</springframework.version> <junit.version>4.7</junit.version> </properties> <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> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </pluginManagement> </build> </project> 首先该父POM,将springframework和junit依赖的版本以Maven变量的形式提取了出来,消除重复,并使各依赖的版本处于更加明显的位置。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |