|
|— parent-module // 父模块项目
| |— pom.xml (pom)
|
|— child1-module // 子模块项目
| |— src
| |— pom.xml (jar)
|
|— child2-module // 子模块项目
| |— src
| |— pom.xml (jar)
|
|— child3-module // 子模块项目
| |— src
| |— pom.xml (war)
|
|
|— pom.xml (pom)
|
|— child1-module // 子模块项目
| |— src
| |— pom.xml (jar)
|
|— child2-module // 子模块项目
| |— src
| |— pom.xml (jar)
|
|— child3-module // 子模块项目
| |— src
| |— pom.xml (war)
|
<modules> <module>child1-module</module> <module>child2-module</module> <module>child3-module</module> </modules
而水平项目布局的声明方式(因其父模块POM文件与子模块处在不同级的目录中):
<modules> <module>../child1-module</module> <module>../child2-module</module> <module>../child3-module</module> </modules>
显然第一种方式要比第二种方式更加简洁。总的来说,推荐使用分层项目布局的方式来组织项目的结构。
|
|— pom.xml (pom)
|
|— user-facade // 子模块项目
| |— src
| |— pom.xml (jar)
|
|— user-service // 子模块项目
| |— src
| |— pom.xml (jar)
|
|— blog-web // 子模块项目
| |— src
| |— pom.xml (war)
|
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=maven-multiple-modules-sample -Dversion=0.0.1-SNAPSHOT
进入父模块目录:
cd maven-multiple-modules-sample
删除父模块的src目录(父模块是一个没有源代码的项目,因此不需要src目录):
rd /s/q src
父模块项目的打包类型必须为pom,修改pom.xml的打包类型如下:
<packaging>pom</packaging>
创建子模块项目user-facade:
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=user-facade -Dversion=0.0.1-SNAPSHOT
子模块pom.xml文件中会自动生成其父模块信息:
<parent> <groupId>org.fanlychie</groupId> <artifactId>maven-multiple-modules-sample</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
创建子模块项目user-service
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=user-service -Dversion=0.0.1-SNAPSHOT
创建子模块项目blog-web:
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=blog-web -Dversion=0.0.1-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp
在父模块POM文件中使用<modules>声明其子模块:
<!-- modules: 声明子模块。模块间的先后顺序是没有要求的,maven不需要开发者考虑模块间的依赖关系, maven在构建项目时,它会对模块自动进行拓扑排序并确保在依赖模块之前构建依赖的模块项目。 module: 它的值通常是子模块项目相对于父模块POM文件的相对路径的名称。 --> <modules> <module>user-facade</module> <module>user-service</module> <module>blog-web</module> </modules>
将项目导入IntelliJ IDEA(主流的JAVA IDE开发工具)。菜单:File --> Open...选择父模块项目:
|
|— parent-module // 父模块项目
| |— pom.xml (pom)
|
|— user-facade // 子模块项目, 用户接口层
| |— src
| |— pom.xml (jar)
|
|— user-service // 子模块项目, 用户业务层
| |— src
| |— pom.xml (jar)
|
|— blog-web // 子模块项目, 访问控制层
| |— src
| |— pom.xml (war)
|
<?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>org.fanlychie</groupId> <artifactId>parent-module</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>parent-module</name> <url>http://maven.apache.org</url> <!-- 子模块的相对路径(相对父模块pom.xml的路径) --> <modules> <module>../user-facade</module> <module>../user-service</module> <module>../blog-web</module> </modules> </project>
子模块项目pom.xml配置文件中继承父模块部分的配置修改为:
<parent> <groupId>org.fanlychie</groupId> <artifactId>parent-module</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 用于指定父模块POM的相对路径。它的默认值是"../" --> <relativePath>../parent-module</relativePath> </parent>
子模块POM继承父模块POM,在子模块POM配置中<relativePath>用于指定其父模块的POM文件的相对路径。如果<relativePath>配置的值是一个目录,则默认寻找该目录下的/pom.xml文件。即等效于:
<parent> <groupId>org.fanlychie</groupId> <artifactId>parent-module</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 用于指定父模块POM的相对路径。它的默认值是"../" --> <relativePath>../parent-module/pom.xml</relativePath> </parent>
将项目导入IntelliJ IDEA。菜单:File --> Open...选择项目的根目录:
元素
|
描述
|
groupId
|
项目组ID
|
version
|
项目版本号
|
description
|
项目描述信息
|
url
|
项目的地址
|
inceptionYear
|
项目成立年份
|
organization
|
项目的组织信息
|
licenses
|
项目许可证
|
developers
|
项目开发者信息
|
contributors
|
项目贡献者信息
|
mailingLists
|
项目的邮件列表
|
scm
|
项目源代码管理系统信息
|
issueManagement
|
项目缺陷跟踪管理系统信息
|
properties
|
项目自定义的属性
|
dependencyManagement
|
项目的依赖管理配置
|
dependencies
|
项目的依赖配置
|
repositories
|
项目的仓库配置
|
pluginRepositories
|
项目的插件仓库配置
|
build
|
项目的构建配置
|
profiles
|
项目的环境配置
|
<!-- 多环境构建配置 --> <profiles> <!-- 开发环境配置 --> <profile> <!-- 标识符, 可以通过 -P[id] 来激活 --> <!-- -Pdev --> <id>dev</id> <!-- 激活条件 --> <activation> <!-- 可以通过 -D[name]=[value] 来激活 --> <!-- -Denv=dev --> <property> <name>env</name> <value>dev</value> </property> <!-- 默认激活 --> <activeByDefault>true</activeByDefault> </activation> <!-- 自定义的属性, 可以通过 ${label} 来引用 --> <!-- ${jdbcUrl} --> <properties> <jdbcUrl>jdbc:mysql://localhost:3306/dev</jdbcUrl> </properties> </profile> <!-- 测试环境配置 --> <profile> <!-- 标识符, 可以通过 -P[id] 来激活 --> <!-- -Ptest --> <id>test</id> <!-- 激活条件 --> <activation> <!-- 可以通过 -D[name]=[value] 来激活 --> <!-- -Denv=dev --> <property> <name>env</name> <value>test</value> </property> </activation> <!-- 自定义的属性, 可以通过 ${label} 来引用 --> <!-- ${jdbcUrl} --> <properties> <jdbcUrl>jdbc:mysql://localhost:3306/test</jdbcUrl> </properties> </profile> </profiles>
自定义属性<properties>需要配合<resources>使用才能发挥作用:
<build> <!-- 类路径资源配置, 最终输出到软件包中 --> <resources> <resource> <!-- 资源目录路径, 此路径是相对当前POM文件的位置 --> <directory>src/main/resources</directory> <!-- filtering=true, 能够代入具体的值替换${label}占位符 --> <filtering>true</filtering> </resource> </resources> </build>
项目配置文件src/main/resources/environment.properties的内容如下:
mysql.jdbc.url = ${jdbcUrl}
打包开发环境的软件包:
$ mvn clean -Pdev package
或:
$ mvn clean -Denv=dev package
打包测试环境的软件包:
$ mvn clean -Ptest package
或:
$ mvn clean -Denv=test package
配置的方式
- 与项目相关的profile配置可以定义在项目pom.xml文件中;
- 与用户相关的profile配置可以定义在用户settings.xml(%USER_HOME%/.m2/settings.xml)文件中;
- 全局的profile配置可以定义在全局settings.xml(%MAVEN_HOME%/.m2/settings.xml)文件中;
<profile> <!-- 参与构建的模块 --> <modules>...</modules> <!-- 构件依赖声明 --> <dependencies>...</dependencies> <!-- 构件依赖管理 --> <dependencyManagement>...</dependencyManagement> <!-- 构件发布管理 --> <distributionManagement>...</distributionManagement> <!-- 插件仓库 --> <pluginRepositories>...</pluginRepositories> <!-- 自定义属性 --> <properties>...</properties> <!-- 生成站点的报告信息 --> <reporting>...</reporting> <!-- 构件仓库 --> <repositories>...</repositories> <!-- 构建配置 --> <build> <!-- 默认的构建目标, 在命令行中如果直接执行mvn没有带生命周期阶段, 则默认执行此处配置的阶段 --> <defaultGoal>...</defaultGoal> <!-- 类路径资源 --> <resources>...</resources> <!-- 单元测试的类路径资源 --> <testResources>...</testResources> <!-- 打包的名称 --> <finalName>...</finalName> </build> </profile>
激活方式
<profile> <id>dev</id> <activation> <!-- 默认激活 --> <activeByDefault>true</activeByDefault> </activation> </profile>
用户或全局settings.xml的配置还可以使用<activeProfiles>来激活:
<profile> <id>dev</id> </profile> <activeProfiles> <!-- 根据ID标识符来激活 --> <activeProfile>dev</activeProfile> </activeProfiles>
命令行可以使用-P[id]或-P [id]或-P [id1,id2]来激活:
<profile> <id>dev</id> </profile> <profile> <id>test</id> </profile>
$ mvn clean -Pdev package
$ mvn clean -P dev,test package
<profile> <activation> <property> <name>env</name> <value>dev</value> </property> </activation> </profile>
$ mvn clean -Denv=dev package
- jdk7-development (source: external)
- dev (source: org.fanlychie:maven-multiple-modules-sample:0.0.2-SNAPSHOT)