<modules> <module>child1-module</module> <module>child2-module</module> <module>child3-module</module> </modules
而水平项目布局的声明方式(因其父模块POM文件与子模块处在不一样级的目录中):html
<modules> <module>../child1-module</module> <module>../child2-module</module> <module>../child3-module</module> </modules>
显然第一种方式要比第二种方式更加简洁。总的来讲,推荐使用分层项目布局的方式来组织项目的结构。mysql
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=maven-multiple-modules-sample -Dversion=0.0.1-SNAPSHOT
进入父模块目录:react
cd maven-multiple-modules-sample
删除父模块的src目录(父模块是一个没有源代码的项目,所以不须要src目录):web
rd /s/q src
父模块项目的打包类型必须为pom,修改pom.xml的打包类型以下:sql
<packaging>pom</packaging>
建立子模块项目user-facade:数据库
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=user-facade -Dversion=0.0.1-SNAPSHOT
子模块pom.xml文件中会自动生成其父模块信息:apache
<parent> <groupId>org.fanlychie</groupId> <artifactId>maven-multiple-modules-sample</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
建立子模块项目user-serviceapp
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=user-service -Dversion=0.0.1-SNAPSHOT
建立子模块项目blog-web:eclipse
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=blog-web -Dversion=0.0.1-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp
在父模块POM文件中使用<modules>声明其子模块:webapp
<!-- 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...选择父模块项目:
<?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> <!-- 参与构建的模块 --> <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
<profile> <activation> <property> <name>env</name> <value>dev</value> </property> </activation> </profile>
$ mvn clean -Denv=dev package