前言
对于一个组织而言,有相同骨架的项目结构肯定有利于对整个项目生命周期的管理,比如流水线不需要特别为每一个项目定制化。同时,有相同骨架的项目,也可以让开发者更快地投入开发,不需要再去纠结环境问题。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
- 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文件在我们的指定的目录下。