-
聚合:
实现一次构建多个项目, 而不是到两个模块的目录下分别执行 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>
通常将聚合模块放在项目目录的最顶层, 其它模块则作为聚合模块的子目录存在.
-
继承:
父 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: 项目的报告输出目录配置, 报告插件配置
-
依赖管理:
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>
-
插件管理:
<!--父 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>
-
聚合与继承的关系:
对于聚合模块来说, 它知道哪些被聚合的模块, 但哪些被聚合的模块不知道这个聚合模块的存在; 对于继承关系的父 pom 来说, 它不知道有哪些子模块继承于它, 但那些子模块都必须知道自己的父 pom 是什么. -
反应堆:
- 构建顺序: 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 模块都会被构建.
-
参考:
[1] : Maven 实战
Maven- 聚合与继承
最新推荐文章于 2024-10-06 20:16:20 发布