前言

对于一个组织而言,有相同骨架的项目结构肯定有利于对整个项目生命周期的管理,比如流水线不需要特别为每一个项目定制化。同时,有相同骨架的项目,也可以让开发者更快地投入开发,不需要再去纠结环境问题。Maven的Archetype就为我们提供了这样的便利,Archetype定义了项目的模版,在生成的时候,输入gav(GroupId, ArtifactId, Version)还有package就能够生成目标模版的项目。这里主要介绍了【单模块】项目骨架的制作过程。

步骤

这里以创建最基础的SpringBoot项目为例,项目只包含了spring-boot-starter-web这个显示声明的依赖,现在将其做成Maven Archetype骨架

创建基础项目

【单模块】制作Maven Archetype - 图1

从基础项目生成Maven Archetype工程

使用以下命令,快速从当前项目创建Maven Archetype工程。

  1. 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,以实现一个最经常使用的功能:

  • 根据项目初始化时传入的参数,自动生成包名 【单模块】制作Maven Archetype - 图2

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

【单模块】制作Maven Archetype - 图3

每一个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如下(看看就好,没有啥参考价值)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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"
  3. xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  5. <fileSets>
  6. <fileSet filtered="true" packaged="true" encoding="UTF-8">
  7. <directory>src/main/java</directory>
  8. <includes>
  9. <include>**/*.java</include>
  10. </includes>
  11. </fileSet>
  12. <fileSet filtered="true" encoding="UTF-8">
  13. <directory>src/main/resources</directory>
  14. <includes>
  15. <include>**/*.properties</include>
  16. </includes>
  17. </fileSet>
  18. <fileSet filtered="true" encoding="UTF-8">
  19. <directory>.idea/libraries</directory>
  20. <includes>
  21. <include>**/*.xml</include>
  22. </includes>
  23. </fileSet>
  24. <fileSet filtered="true" encoding="UTF-8">
  25. <directory>.idea/inspectionProfiles</directory>
  26. <includes>
  27. <include>**/*.xml</include>
  28. </includes>
  29. </fileSet>
  30. </fileSets>
  31. </archetype-descriptor>

安装 or 发布

进入到Maven Archetype工程根目录,这里是target/generated-sources/archetype,运行以下指令,安装到本地

  1. mvn clean install

安装完毕后,就可以在本地仓库找到对应的archetype了 【单模块】制作Maven Archetype - 图4

使用

两种方式,一种是添加到IDEA,另外一种是使用命令行。都可以百度到,或者问一下chatGPT,这里就记录一下使用命令行生成的命令(做个笔记)。

  1. mvn archetype:generate \
  2. -DarchetypeGroupId=com.example \
  3. -DarchetypeArtifactId=demo-archetype \
  4. -DarchetypeVersion=0.0.1-SNAPSHOT \
  5. -DgroupId=cn.acmsmu \
  6. -DartifactId=test-project \
  7. -Dversion=1.0 \
  8. -Dpackage=cn.acmsmu.test \
  9. -DarchetypeCatalog=local \
  10. -DinteractiveMode=false

这样,我们就创建了一个项目,我们将项目打开看一下目录结构是否符合预期

【单模块】制作Maven Archetype - 图5

可以看到,java文件在我们的指定的目录下。

参考资料

  • Maven archetype plugin doesn’t let .resources in archetype-resources through
  • maven archetype 简书
  • Maven自定义Archetype项目模板
  • 《Maven实战》第18章