前言
对于一个组织而言,有相同骨架的项目结构肯定有利于对整个项目生命周期的管理,比如流水线不需要特别为每一个项目定制化。同时,有相同骨架的项目,也可以让开发者更快地投入开发,不需要再去纠结环境问题。Maven的Archetype就为我们提供了这样的便利,Archetype定义了项目的模版,在生成的时候,输入gav(GroupId, ArtifactId, Version)还有package就能够生成目标模版的项目。这里主要介绍了【单模块】项目骨架的制作过程。
步骤
这里以创建最基础的SpringBoot项目为例,项目只包含了spring-boot-starter-web这个显示声明的依赖,现在将其做成Maven Archetype骨架
创建基础项目

从基础项目生成Maven Archetype工程
使用以下命令,快速从当前项目创建Maven Archetype工程。
mvn -s "/path/to/maven/settings.xml" archetype:create-from-project
其中
- -s指向了Maven Settings.xml路径
编辑archetype-metadata.xml
上述命令执行成功之后,会在当前项目的target/generated-sources/archetype目录下生成Maven Archetype工程。现在要修改项目的archetype-metadata.xml,以实现一个最经常使用的功能:
- 根据项目初始化时传入的参数,自动生成包名

打开项目的archetype-metadata.xml,会发现文件由一个个fileSet标签构成

每一个fileSet定义一个目录,以及与该目录相关的包含或排除规则。每一个fileSet有两个属性:
- filtered → \rightarrow→ 表示是否对该文件集合应用属性替换。例如,像${x}这样的内容,是否被替换为命令行入参x的值
- packaged → \rightarrow→ 表示是否将该目录下的内容放到生成项目的包路径下
附: 创建Archetype时,必须要提供的几个参数
groupId: 创建项目的groupId artifactId: 创建项目的artifactId version: 创建项目的version
附: 创建Archetype时,必须要提供的几个参数
- groupId: 创建项目的groupId
- artifactId: 创建项目的artifactId
- version: 创建项目的version
- package: 创建项目的默认Java包名package: 创建项目的默认Java包名
我们通常需要将*.java文件放到对应的包下,所以在在上图红框处的fileSet的package属性,要设置为true
如果要把.gitignore添加到archetype,按照常理修改fileSet路径可能不行,据说是bug,我用Maven 3.6.1,是不行的~可以参考这篇问答的做法:Maven archetype plugin doesn’t let .resources in archetype-resources through
修改完成的archetype-metadata.xml如下(看看就好,没有啥参考价值)
<?xml version="1.0" encoding="UTF-8"?><archetype-descriptor xsi:schemaLocation="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0 http://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd" name="demo"xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><fileSets><fileSet filtered="true" packaged="true" encoding="UTF-8"><directory>src/main/java</directory><includes><include>**/*.java</include></includes></fileSet><fileSet filtered="true" encoding="UTF-8"><directory>src/main/resources</directory><includes><include>**/*.properties</include></includes></fileSet><fileSet filtered="true" encoding="UTF-8"><directory>.idea/libraries</directory><includes><include>**/*.xml</include></includes></fileSet><fileSet filtered="true" encoding="UTF-8"><directory>.idea/inspectionProfiles</directory><includes><include>**/*.xml</include></includes></fileSet></fileSets></archetype-descriptor>
安装 or 发布
进入到Maven Archetype工程根目录,这里是target/generated-sources/archetype,运行以下指令,安装到本地
mvn clean install
安装完毕后,就可以在本地仓库找到对应的archetype了

使用
两种方式,一种是添加到IDEA,另外一种是使用命令行。都可以百度到,或者问一下chatGPT,这里就记录一下使用命令行生成的命令(做个笔记)。
mvn archetype:generate \-DarchetypeGroupId=com.example \-DarchetypeArtifactId=demo-archetype \-DarchetypeVersion=0.0.1-SNAPSHOT \-DgroupId=cn.acmsmu \-DartifactId=test-project \-Dversion=1.0 \-Dpackage=cn.acmsmu.test \-DarchetypeCatalog=local \-DinteractiveMode=false
这样,我们就创建了一个项目,我们将项目打开看一下目录结构是否符合预期

可以看到,java文件在我们的指定的目录下。
参考资料
- Maven archetype plugin doesn’t let .resources in archetype-resources through
- maven archetype 简书
- Maven自定义Archetype项目模板
- 《Maven实战》第18章
