maven自定义模板

Maven 自定义 Archetype 模板:打造专属项目骨架

在团队开发中,为了保持项目结构的一致性,通常需要统一的项目模板(Archetype)。Maven 允许我们基于现有项目创建自定义 Archetype,实现标准化的项目初始化。本文将详细介绍自定义 Archetype 的创建、安装和使用流程。

自定义 Archetype 的核心价值

  • 标准化:统一团队项目结构、依赖版本和配置规范。
  • 高效性:避免重复创建目录、配置依赖等繁琐工作。
  • 可维护性:模板更新后,所有基于模板创建的项目可同步规范。

创建自定义 Archetype 的步骤

准备基础项目

首先需要一个符合预期规范的 Maven 项目(作为模板的基础),包含:

  • 标准目录结构(如 src/main/javasrc/test/java 等)。
  • 统一的 pom.xml 配置(如通用依赖、插件、属性等)。
  • 必要的基础代码或配置文件(如工具类、日志配置等)。

示例项目结构:

micro_service_parent/
├── pom.xml                  # 包含通用依赖和插件配置
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── zhanghe/
│   │   │           └── util/
│   │   │               └── CommonUtil.java  # 通用工具类
│   │   └── resources/
│   │       └── logback.xml                  # 统一日志配置
│   └── test/
│       └── java/
│           └── com/
│               └── zhanghe/
│                   └── TestBase.java        # 测试基类

生成 Archetype 骨架

进入基础项目的根目录,执行以下命令生成 Archetype 结构:

mvn archetype:create-from-project

命令执行后会:

  • target/generated-sources/archetype 目录下生成 Archetype 骨架。
  • 自动处理项目中的变量替换(如将项目特定信息转换为模板变量)。

生成的 Archetype 结构解析:

target/generated-sources/archetype/
├── pom.xml                  # Archetype 自身的 POM 配置
├── src/
│   └── main/
│       └── resources/
│           ├── archetype-resources/  # 模板文件(基于基础项目生成)
│           │   ├── pom.xml           # 项目 POM 模板
│           │   └── src/              # 源码和资源模板
│           └── META-INF/
│               └── maven/
│                   └── archetype-metadata.xml  # Archetype 元数据配置

安装 Archetype 到本地仓库

进入生成的 Archetype 目录:

cd target/generated-sources/archetype

执行安装命令,将 Archetype 安装到本地仓库:

mvn install

执行后效果:

  • Archetype 会被打包并安装到本地仓库(默认 ~/.m2/repository)。
  • 目录结构为 groupId/artifactId/version/(如 com/zhanghe/study/springcloud/micro_service_parent-archetype/1.0-SNAPSHOT/)。

更新本地 Archetype 目录

执行以下命令,让 Maven 识别新安装的 Archetype:

mvn archetype:crawl
作用:
  • 在本地仓库根目录生成 / 更新 archetype-catalog.xml 文件,记录所有本地可用的 Archetype。
  • 新创建的 Archetype 会被添加到该文件中,例如:
<archetype>
  <groupId>com.zhanghe.study.springcloud</groupId>
  <artifactId>micro_service_parent-archetype</artifactId>
  <version>1.0-SNAPSHOT</version>
  <description>micro_service_parent</description>
</archetype>

使用自定义 Archetype 创建项目

基础命令

在任意目录执行以下命令,基于自定义 Archetype 创建项目:

mvn archetype:generate \
  -DarchetypeCatalog=local \  # 指定使用本地目录(archetype-catalog.xml)
  -DarchetypeGroupId=com.zhanghe.study.springcloud \  # 自定义 Archetype 的 groupId
  -DarchetypeArtifactId=micro_service_parent-archetype \  # 自定义 Archetype 的 artifactId
  -DarchetypeVersion=1.0-SNAPSHOT \  # 自定义 Archetype 的版本
  -DgroupId=com.zhanghe.newproject \  # 新项目的 groupId
  -DartifactId=new-service \  # 新项目的 artifactId
  -Dversion=1.0-SNAPSHOT \  # 新项目的版本
  -DinteractiveMode=false  # 非交互模式(无需手动确认)

交互模式(可选)

若省略 -DinteractiveMode=false,Maven 会进入交互模式,逐步提示输入项目信息:

mvn archetype:generate -DarchetypeCatalog=local

执行后会:

  1. 列出本地所有 Archetype(包括自定义的),选择对应编号。
  2. 依次提示输入新项目的 groupIdartifactIdversion 等信息。

高级配置:定制 Archetype 元数据

生成的 archetype-metadata.xml(位于 src/main/resources/META-INF/maven/)用于定义模板的结构和规则,可手动修改以优化 Archetype:

<archetype-descriptor name="micro_service_parent">
  <fileSets>
    <!-- 包含的文件集(可控制哪些文件纳入模板) -->
    <fileSet filtered="true" encoding="UTF-8">
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.java</include>
      </includes>
    </fileSet>
    <!-- 排除不需要的文件(如特定环境的配置) -->
    <fileSet>
      <directory>src/main/resources</directory>
      <excludes>
        <exclude>local.properties</exclude>
      </excludes>
    </fileSet>
  </fileSets>
  <!-- 自定义属性(生成项目时可动态传入) -->
  <requiredProperties>
    <requiredProperty key="package">
      <defaultValue>com.zhanghe</defaultValue>  <!-- 默认包名 -->
    </requiredProperty>
  </requiredProperties>
</archetype-descriptor>
  • filtered="true":表示文件内容中的变量(如 ${artifactId})会被替换为实际值。
  • includes/excludes:控制纳入模板的文件,避免冗余。

共享自定义 Archetype(团队协作)

为了让团队成员共享自定义 Archetype,需将其部署到私服(如 Nexus)

  1. 在 Archetype 项目的 pom.xml 中配置私服地址:

    <distributionManagement>
      <repository>
        <id>nexus-releases</id>
        <url>http://your-nexus.com/repository/releases/</url>
      </repository>
      <snapshotRepository>
        <id>nexus-snapshots</id>
        <url>http://your-nexus.com/repository/snapshots/</url>
      </snapshotRepository>
    </distributionManagement>
  2. 部署到私服:

    mvn deploy
  3. 团队成员配置私服的 Archetype 目录:
    settings.xml 中添加:

    <profiles>
      <profile>
        <id>archetype</id>
        <properties>
          <archetypeCatalog>http://your-nexus.com/repository/public/archetype-catalog.xml</archetypeCatalog>
        </properties>
      </profile>
    </profiles>
    <activeProfiles>
      <activeProfile>archetype</activeProfile>
    </activeProfiles>