Maven Archetype 怎么用,什么时候该自定义模板?
Maven Archetype 可以理解成 Maven 的项目模板:它把目录结构、POM、示例代码和默认配置打包起来,让新项目不用从空文件夹开始搭。它适合重复创建结构相似的项目,比如公司内部的 Spring Boot 服务、SDK 工程、插件工程。真正要注意的是,Archetype 不是越复杂越好,模板太重会把过时配置复制到每个新项目里。
快速生成项目
使用官方 quickstart 模板可以快速创建一个普通 Java 项目:
bashmvn archetype:generate -DgroupId=com.example -DartifactId=demo-app -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Web 项目也可以使用 maven-archetype-webapp,但现在很多团队更倾向用 Spring Initializr 创建 Spring Boot 项目。Archetype 的价值更多体现在公司内部模板:统一包名、日志配置、基础依赖、CI 文件和代码规范。
自定义 Archetype 的关键文件
模板工程通常包含 archetype-metadata.xml,用来声明哪些文件参与生成、哪些文件需要变量替换。
xml<archetype-descriptor name="service-template"> <fileSets> <fileSet filtered="true" packaged="true"> <directory>src/main/java</directory> <includes> <include>**/*.java</include> </includes> </fileSet> <fileSet filtered="true"> <directory>src/main/resources</directory> <includes> <include>**/*.yml</include> </includes> </fileSet> </fileSets> </archetype-descriptor>
生成和安装模板常用命令如下:
bashmvn archetype:create-from-project cd target/generated-sources/archetype mvn install
追问
Maven Archetype 和直接复制项目模板有什么区别?
直接复制最快,但容易把旧包名、旧 artifactId、无用配置一起复制过去。Archetype 会在生成时替换 groupId、artifactId、package 等变量,更适合标准化创建。它的边界是模板维护成本更高,尤其当基础依赖升级时,需要同步更新模板。小团队项目少时复制模板够用,项目数量多或规范要求强时再上 Archetype 更划算。
自定义 Archetype 里哪些文件应该做过滤?
需要替换变量的文本文件适合过滤,比如 Java 类、POM、YAML、properties。二进制文件、图片、证书和压缩包不要开启过滤,否则可能被 Maven 当文本处理后损坏。一个常见坑是对所有 resources 都开 filtered=true,结果字体、图片或 keystore 构建后不可用。更稳的做法是只 include 明确需要替换的文件类型。
Archetype 适合生成 Spring Boot 项目吗?
可以,但不一定是首选。Spring Boot 项目如果只是选择依赖和版本,Spring Initializr 更方便,生态支持也更及时。Archetype 更适合加入公司内部规范,例如统一异常结构、日志埋点、健康检查、Dockerfile 和 CI 模板。取舍点是你要通用生态模板,还是要强绑定企业工程规范。
模板里要不要放很多示例业务代码?
不建议放太多。示例代码越多,新项目删除成本越高,也更容易留下没人维护的假业务逻辑。可以保留一个最小可运行的 Controller、配置类或单元测试,用来证明生成项目能启动。边界是模板应表达工程骨架,而不是替业务团队提前设计业务分层。
自定义 Archetype 发布后怎么让团队使用?
可以先把模板安装到本地仓库验证,再发布到公司 Nexus 或 Artifactory。使用时指定 archetype 坐标即可:
bashmvn archetype:generate -DarchetypeGroupId=com.company -DarchetypeArtifactId=service-archetype -DarchetypeVersion=1.2.0 -DgroupId=com.company.demo -DartifactId=order-service -DinteractiveMode=false
模板版本也要像普通依赖一样管理。每次更新基础依赖或目录规范,都应发布新版本,而不是覆盖旧版本;否则老项目排查生成来源时会很痛苦。