Maven 进阶之旅

1,055 阅读6分钟

1. 分模块开发与设计

1.1 工程模块与模块划分

  • 分模块开发中,每个模块中仅包含当前模块对应的功能类与配置文件
  • Spring 核心配置根据模块功能不同进行独立制作(如:applicationContext-dao.xmlapplicationContext-service.xml...)
  • web.xml 需要加载所有的 Spring 核心配置文件

1.2 模块聚合

一个项目往往由多个模块构成的,在进行构建时,针对每个模块都进行构建命令是一件非常繁琐又容易出错的事情,所以 Maven 的聚合功能能够替我们完成进行一次构建命令完成全部模块的构建,所以衍生出了构建管理模块,也就是所谓的模块聚合

聚合实现

1)首先创建一个空模块,打包类型定义为 pom

<!--定义该工程用于进行模块管理-->
<packaging>pom</packaging>

2)并定义当前模块进行构建操作时关联的其他模块名称:

<!--管理的工程列表-->
<modules>
    <!--具体的工程名称-->
    <module>../ssm_pojo</module>
    <module>../ssm_dao</module>
    <module>../ssm_service</module>
    <module>../ssm_controller</module>
</modules>

注意:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关!

1.3 模块继承

Maven 项目模块中,每一个模块都会依赖一些资源,例如:下图中 ssm_service 模块需要使用 spring-context 5.1.9 资源,而 ssm_dao 模块需要使用 spring-context 5.2.0 资源,资源可能发生重复甚至由于版本不兼容导致冲突,从而引发错误。

所以我们需要再生成一个新的模块来管理其余模块的资源依赖,只需在新模块上写上统一的资源依赖和版本,其余模块只需引用而无需标注版本号。

继承实现

1)在父工程中定义依赖管理:

<!--声明此处进行依赖管理-->
<dependencyManagement>
    <!--具体的所有依赖-->
    <dependencies>
    	<!--Spring 环境-->
        <dependency>
        	<groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        ...
        ...
    </dependencies>
</dependencyManagement>

2)在子工程中声明其父工程坐标与其对应的位置:

<!--定义该工程的父工程-->
<parent>
    <groupId>com.one</groupId>
    <!--ssm:父工程的模块名称-->
    <artifactId>ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--填写父工程的pom文件-->
    <relativePath>../ssm/pom.xml</relativePath>
</parent>

<!--当前模块的定义-->
<!-- <groupId>com.one</groupId> 组织Id同样可省略-->
<artifactId>ssm</artifactId>
<!-- <version>1.0-SNAPSHOT</version> 可省略-->
<packaging>jar</packaging>

3)在子工程定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本,如需覆盖,则直接填写所需的版本号即可:

<dependencies>
    	<!--Spring 环境-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
    	...
    </dependencies>

1.3.1 可继承资源

  • groupId:形目组 ID,项目坐标的核心元素
  • version:项目版本,项目坐标的核心因素
  • description:项目的描述信息
  • organization:项目的组织信息
  • inceptionYear:项目的创始年份
  • url:项目的 URL 地址
  • developers:项目的开发者信息
  • contributors:项目的贡献者信息
  • distributionManagement:项目的部署配置
  • issueManagement:项目的缺陷跟踪系统信息
  • ciManagement:项目的持续集成系统信息
  • scm:项目的版本控制系统信息
  • malilingLists:项目的邮件列表信息
  • properties:自定义的 Maven 属性
  • dependencies:项目的依赖配置
  • dependencyManagement:项目的依赖管理配置
  • repositories:项目的仓库配置
  • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
  • reporting:包括项目的报告输出目录配置、报告插件配置等

1.4 聚合 & 继承 の 小结

1.4.1 作用

  • 聚合:快速构建项目
  • 继承:快速配置

1.4.2 相同点

  • 聚合与继承的 pom.xml 文件打包方式均为 pom,可以将两种关系制作到同一个 pom 文件中
  • 聚合与继承均属于设计型模块,并无实际的模块内容

1.4.3 不同点

  • 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
  • 继承是在子模块中配置关系,夫模块无法感知哪些子模块继承了自己

2. 属性定义与使用

2.1 自定义属性

1)作用:等价于定义变量,方便统一维护

2)定义:

<!--定义自定义属性-->
<properties>
	<spring.version>5.1.9.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
</properties>

3)用法:

<dependency>
	<groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

2.2 内置属性

1)作用:使用 maven 定义的内置属性,快速配置

2)用法:

${basedir}
${version}
${...}

2.3 Setting 属性

1)作用:使用 Maven 配置文件 setting.xml 中的标签属性,用于动态配置

2)用法:

${settings.localRepository}

2.4 Java 系统属性

1)作用:读取 Java 系统变量

2)系统属性查询方式:

mvn help:system

3)用法:

${user.home}

2.5 环境变量属性

1)作用:使用 Maven 配置文件 setting.xml 中的标签属性,用于动态配置

2)环境变量属性查询方式:

mvn help:system

3)用法:

${env.JAVA_HOME}

3. 版本管理

3.1 工程版本区分

SNAPSHOT:快照版本

  • 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和时时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)
  • 快照版本会随着开发的进展不断更新

RELEASE:发布版本

  • 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本

3.2 工程版本号约定

约定规范

  • <主版本>.<次版本>.<增量版本>.<里程碑版本>
  • 主版本:表示项目重大架构的变更,如:Spring5 相对于 Spring4 的迭代
  • 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞
  • 增量版本:表示有重大漏洞的修复
  • 里程碑版本:表明一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说还不是很稳定,有待更多的测试

规范

  • 5.1.9.RELEASE

4. 资源配置

我们不仅需要管理 pom.xml 文件中的属性,比如说:还需要考虑到 resources 中的 properties 文件...

此时若要统一管理,可在 pom.xml 文件中进行统一资源配置。

1)在 pom.xml 文件中设定配置文件路径

<build>
	<resources>
    	<!--设定配置文件对应的位置目录,支持使用属性动态设定路径-->
        <directory>${project/basedir}src/main/resources</directory>
        <!--开启对配置文件的资源加载过滤-->
        <filtering>true</filtering>
    </resources>
</build>

2)开启加载 pom 属性过滤功能

<properties>
	<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
    <jdbc.url>com.mysql.jdbc.Driver</jdbc.url>
    <jdbc.username>com.mysql.jdbc.Driver</jdbc.username>
    <jdbc.password>com.mysql.jdbc.Driver</jdbc.password>
</properties>

3)使用 ${属性名} 格式引用 pom 属性

5. 多环境开发配置

当我们开发一个组件后,在不同的环境下加载的配置不同,例如下图:

在生产环境中加载配置 A,在开发环境中加载配置 B,而在测试环境中加载配置 C ...

我们不能因为环境变化而不断修改配置文件,所以我们需要对多种环境进行兼容配置

pom.xml 文件多环境配置:

<!--创建多环境-->
<profiles>
    <!--定义具体的环境:生产环境-->
    <profile>
    	<!--定义环境对应的唯一名称-->
        <id>pro_env</id>
        <!--定义环境中专用的属性值-->
        <properties>
        	<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
        </properties>
        <!--设置默认启动-->
        <activation>
        	<activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <!--定义具体的环境:开发环境-->
    <profile>
        <id>dev_env</id>
        ... 
    </profile>
</profiles>

加载指定环境

  • 调用格式
mvn 指令 -P 环境定义id
  • 范例
mvn install -P pro_env

6. 跳过测试

6.1 跳过测试环节的应用场景

  • 整体模块功能未开发
  • 模块中某个功能未开发完毕
  • 单个功能更新调试导致其他功能失败
  • 快速打包
  • ...

6.2 跳过测试的三种方式

6.2.1 命令跳过测试

  • 命令
mvn 指令 -D skipTests
  • 注意事项:执行的指令生命周期必须包含测试环节!

6.2.2 界面操作跳过测试

6.2.3 配置跳过测试

  1. 跳过全部测试
<plugins>
	<plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version>
        <configuration>
            <!--设置跳过全部测试-->
        	<skipTests>true</skipTests>
        </configuration>
    </plugin>
</plugins>
  1. 跳过部分测试
<plugins>
	<plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version>
        <configuration>
            <!--包含指定的测试用例-->
            <includes>
            	<include>**/UserServiceTest.java</include>
            </includes>
            <!--排除指定的测试用例-->
            <excludes>
            	<exclude>**/AccountServiceTest.java</exclude>
            </excludes>
        </configuration>
    </plugin>
</plugins>

7. 私服

在分模块合作开发中,私服起着至关重要的作用

7.1 Nexus

Nexus 是 Sonatype 公司的一款 maven 私服产品

下载地址:help.sonatype.com/repomanager…

7.2 Nexus 安装、启动与配置

  • 启动服务器(命令行启动)
nexus.exe /run nexus
  • 访问服务器(默认端口:8081)
http://localhost:8081
  • 修改基础配置信息
    • 安装路径下 etc 目录中 nexus-default.properties 文件保存有 nexus 基础配置信息,例如:默认访问端口
  • 修改服务器运行配置信息
    • 安装路径下 bin 目录中 nexus.vmoptions 文件保存有 nexus 服务器启动对应的配置信息,例如:默认占用内存空间

7.3 私服资源获取

7.4 仓库分类

  • 宿主仓库 hosted
    • 保存无法从中央仓库获取的资源
      • 自主研发
      • 第三方非开源项目
  • 代理仓库 proxy
    • 代理远程仓库,通过 nexus 访问其他公共仓库,例如中央仓库
  • 仓库组 group
    • 将若干个仓库组成一个群组,简化配置
    • 仓库组不能保存资源,属于设计型仓库

7.5 资源上传

上传资源时需要提供对应的信息:

  • 保存位置(宿主仓库)
  • 资源文件
  • 对应坐标

7.6 IDEA 环境中的资源上传与下载

7.7 访问私服配置(本地仓库访问私服)

  • 配置本地仓库访问私服的权限(setting.xml)
<servers>
    <server>
    	<id>one-release</id>
        <username>admin</username>
        <password>123456</password>
    </server>
    <server>
    	<id>one-snapshots</id>
        <username>admin</username>
        <password>123456</password>
    </server>
</servers>
  • 配置本地仓库资源来源(setting.xml)
<mirrors>
    <mirror>
        <id>nexus-one</id>
        <mirrorOf>*</mirrorOf>
        <url>http://localhost:8081/repository/maven-public/</url>
    </mirror>
</mirrors>

7.8 访问私服配置(项目工程访问私服)

  • 配置当前项目访问私服上传资源的保存位置(pom.xml)
<distributionManagement>
    <repository>
        <id>one-release</id>
        <url>http://localhost:8081/repository/one-release/</url>
    </repository>
    <snapshotRepository>
        <id>one-snapshots</id>
        <url>http://localhost:8081/repository/one-snapshots/</url>
    </snapshotRepository>
</distributionManagement>
  • 发布资源到私服的命令
mvn deploy

以上内容充其量只是 Maven 进阶中的基础知识,或者说远远未达到...

有关 Maven 的更多知识,小伙伴们可以去参考更多博客~

原创不易🧠 转载请标明出处🌊
若本文对你有所帮助,点赞支持嗷🔥