Maven模块化开发、聚合继承与多环境配置实战

好的,以下是《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 属性

  1. 设置 pom.xml 资源过滤:
<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
  1. user.properties 配置:
jdbc.url=${jdbc.url}
  1. 定义 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>
  1. 指定环境构建:
mvn clean install -Pdev-env

2.4 多环境配置

场景说明:

  • 不同环境使用不同数据库、日志、配置文件

  • 例如:

    • 本地开发连接本地数据库
    • 生产环境连接远程数据库

实现步骤:

  1. 设置资源文件过滤(同上)

  2. user.properties 中使用占位符:

jdbc.url=${jdbc.url}
  1. 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>
  1. 使用指定环境构建命令:
mvn package -Pdev-env
  1. 打包后查看生成的配置文件是否为对应环境值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值