maven自定义模板
Maven 自定义 Archetype 模板:打造专属项目骨架
在团队开发中,为了保持项目结构的一致性,通常需要统一的项目模板(Archetype)。Maven 允许我们基于现有项目创建自定义 Archetype,实现标准化的项目初始化。本文将详细介绍自定义 Archetype 的创建、安装和使用流程。
自定义 Archetype 的核心价值
- 标准化:统一团队项目结构、依赖版本和配置规范。
- 高效性:避免重复创建目录、配置依赖等繁琐工作。
- 可维护性:模板更新后,所有基于模板创建的项目可同步规范。
创建自定义 Archetype 的步骤
准备基础项目
首先需要一个符合预期规范的 Maven 项目(作为模板的基础),包含:
- 标准目录结构(如
src/main/java、src/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
执行后会:
- 列出本地所有 Archetype(包括自定义的),选择对应编号。
- 依次提示输入新项目的
groupId、artifactId、version等信息。
高级配置:定制 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):
在 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>部署到私服:
mvn deploy团队成员配置私服的 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>