Maven高级

Maven 多模块、继承、聚合与私服

大型项目可按职责拆成多个模块,父 POM 统一版本与插件,聚合 POM 按依赖关系构建全部模块,私服负责团队内部制品共享。

Maven 多模块与仓库

模块拆分

示例:

tlias 多模块工程结构

拆分依据应是稳定职责和依赖方向,不是“每几个类建一个模块”。避免所有模块互相依赖。

继承

子模块通过 parent 继承公共属性、依赖管理和插件管理:

代码块XML · 6 行收起展开
<parent>
  <groupId>com.example</groupId>
  <artifactId>tlias-parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <relativePath>../pom.xml</relativePath>
</parent>

父工程通常使用 pom 打包,可多层继承,但层级过深会让生效配置难以追踪。

属性与版本锁定

代码块XML · 14 行收起展开
<properties>
  <java.version>21</java.version>
  <jjwt.version>0.12.6</jjwt.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-api</artifactId>
      <version>${jjwt.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

dependencyManagement 只声明版本规则,不会自动把依赖加入子模块;子模块仍要声明 groupId 与 artifactId。

普通 dependencies 会真正引入依赖,并可能传递给子模块或下游。

聚合

代码块XML · 7 行收起展开
<packaging>pom</packaging>

<modules>
  <module>tlias-pojo</module>
  <module>tlias-utils</module>
  <module>tlias-web-management</module>
</modules>

聚合用于一次构建多个模块。Maven Reactor 会根据模块依赖计算顺序,不依赖 modules 的书写先后。

继承与聚合

对比继承聚合
配置位置子 POM 指向父 POM聚合 POM 列出模块
目的复用配置、统一版本一次构建全部模块
是否必须同时使用

实践中父 POM 经常同时承担两种职责,但概念不能混淆。

私服

私服是团队内部远程仓库,用于:

  • 缓存代理中央仓库。
  • 发布内部 Release 与 Snapshot。
  • 统一制品来源与权限。

依赖通常按“本地仓库 → 私服 → 私服代理的中央仓库”解析。

凭证

settings.xml:

代码块XML · 7 行收起展开
<servers>
  <server>
    <id>maven-releases</id>
    <username>${env.MAVEN_USER}</username>
    <password>${env.MAVEN_PASSWORD}</password>
  </server>
</servers>

server id 必须与发布仓库 id 对应。真实凭证不写入项目 POM。

发布地址

代码块XML · 10 行收起展开
<distributionManagement>
  <repository>
    <id>maven-releases</id>
    <url>https://repo.example.com/repository/releases/</url>
  </repository>
  <snapshotRepository>
    <id>maven-snapshots</id>
    <url>https://repo.example.com/repository/snapshots/</url>
  </snapshotRepository>
</distributionManagement>

Release 版本应不可覆盖;Snapshot 可持续迭代但不应进入正式生产基线。

镜像

代码块XML · 5 行收起展开
<mirror>
  <id>maven-public</id>
  <mirrorOf>*</mirrorOf>
  <url>https://repo.example.com/repository/public/</url>
</mirror>

镜像用于依赖下载,distributionManagement 用于发布,两者职责不同。

验证

代码块BASH · 4 行收起展开
mvn help:effective-pom
mvn dependency:tree
mvn clean verify
mvn deploy

部署前确认仓库权限、版本类型、签名/校验策略和 CI 凭证注入。

延伸阅读