好的,以下是《maven讲义.pdf》中 第 2.2 ~ 2.4 章 的原文内容,已完整转换为 Markdown 格式,未做任何内容删改或润色:
2.2 聚合与继承
2.2.1 聚合
我们思考一个问题:
- 上面的各个模块是分开独立开发的,彼此互相独立,互补影响。假设如果现在maven-dao模块更新升级了,那么其他模块是如何感知dao模块发生了变化的?
解决方案:
- 会不会有一个工程,专门对这些模块进行管理。对这些模块进行统一的编译,测试,打包等操作。一旦一个模块发生了变化,会同时对其他模块也进行编译、测试、打包。
此时就需要用到聚合的思想。
聚合的作用:用于快速构建maven工程,一次性管理多个模块。
创建一个maven工程,定义打包方式为pom
定义当前模块管理的其他模块的名称
在子模块里面引入父工程
在本案例中,我们的maven-user就是一个父工程,专门用来管理其他的子模块。
此时我们测试一下。
在父工程上,使用compile命令:
<packaging>pom</packaging>
<modules>
<!--具体模块的名称-->
<module>maven-pojo</module>
<module>maven-dao</module>
<module>maven-service</module>
<module>maven-servlet</module>
<module>maven-utils</module>
</modules>
<parent>
<artifactId>maven-user</artifactId>
<groupId>com.xq</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
此时所有的模块都会进行编译。
问题:编译的顺序是怎么样的?
参与聚合操作的模块最终执行顺序与模块的依赖关系有关系。跟配置顺序没有关系。
各个模块的打包方式:
- 父工程打 pom
- Web 工程打 war 包
- 其他工程打 jar 包(如果没有打包配置,默认打 jar)
2.2.2 继承
通过继承可以实现在父工程中的配置,让子模块沿用。类似于 Java 中的继承关系。
实现:
- 在子模块中,使用 parent 标签引入父工程,这样子工程和父工程就有了继承关系了。
测试观察效果:
在 maven-dao 的 pom 文件里面没有配置任何依赖资源。
但是 maven-dao 却是继承了 maven-user 父工程的所有依赖资源:
<parent>
<artifactId>maven-user</artifactId>
<groupId>com.xq</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
其他子模块一样,都继承了父工程的资源。
思考:这样的做法有没有问题?
答案:有,并不是子模块都需要所有父工程的资源。例如 maven-dao 并不需要 tomcat 插件,也不需要 servlet、jsp 相关依赖。如果全部资源都继承,会导致子模块臃肿,打包部署效率低。
解决方案:使用 <dependencyManagement>
标签管理依赖。
具体操作如下:
在父工程的 pom.xml
中:
<dependencyManagement>
<dependencies>
<!-- 示例依赖 -->
<dependency>
<groupId>com.xq.service</groupId>
<artifactId>maven-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xq.dao</groupId>
<artifactId>maven-dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
</dependencyManagement>
然后在子模块中按需引入,无需写版本号。
同理,插件也可以使用 <pluginManagement>
管理:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8088</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
总结:聚合与继承的关系
作用区别:
- 聚合用于快速构建项目
- 继承用于快速配置
相同点:
pom.xml
打包方式都为pom
- 都属于设计型模块,无实际代码
不同点:
- 聚合在父模块中配置
<modules>
,父知道子 - 继承在子模块中配置
<parent>
,子知道父
2.3 属性与版本管理 & 多资源配置
2.3.1 属性
在 pom.xml
中使用 <properties>
统一管理版本号:
<properties>
<javax.servlet-api>3.1.0</javax.servlet-api>
<javax.servlet.jsp-api>2.3.1</javax.servlet.jsp-api>
<jstl>1.2</jstl>
<taglibs-standard-impl>1.2.5</taglibs-standard-impl>
<c3p0>0.9.1.2</c3p0>
<commons-beanutils>1.8.3</commons-beanutils>
<commons-dbutils>1.6</commons-dbutils>
<commons-logging>1.1.1</commons-logging>
<mysql>5.1.18</mysql>
</properties>
使用方式:
<version>${mysql}</version>
2.3.2 版本管理
- 模块可能会随着开发不断迭代,产生多个版本。
- 在
pom.xml
中定义<version>1.0-SNAPSHOT</version>
- 打包后在本地仓库中可见不同版本的 jar 包目录
2.3.3 在配置文件中引入 pom 属性
- 设置
pom.xml
资源过滤:
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
user.properties
配置:
jdbc.url=${jdbc.url}
- 定义 profile:
<profiles>
<profile>
<id>pro-env</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
</profile>
<profile>
<id>dev-env</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3308/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
- 指定环境构建:
mvn clean install -Pdev-env
2.4 多环境配置
场景说明:
-
不同环境使用不同数据库、日志、配置文件
-
例如:
- 本地开发连接本地数据库
- 生产环境连接远程数据库
实现步骤:
-
设置资源文件过滤(同上)
-
在
user.properties
中使用占位符:
jdbc.url=${jdbc.url}
- 在
pom.xml
中配置多个环境 profile:
<profiles>
<profile>
<id>pro-env</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
</profile>
<profile>
<id>dev-env</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3308/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
- 使用指定环境构建命令:
mvn package -Pdev-env
- 打包后查看生成的配置文件是否为对应环境值。