介绍

Maven自身提供了许多Archetype来方便用户创建Project,但是每个团队都可能会有一些常用的文件或配置,为了避免在创建project时重复的拷贝和修改,我们通过自定义Archetype来规范显得还蛮有必要,下面简单介绍下使用maven-archetype-archetype来构建自己的Archetype的过程。

用来创建archetype的一个模板是**maven-archetype-archetype

  1. $ mvn archetype:generate \
  2. -DarchetypeGroupId=<archetype-groupId> \
  3. -DarchetypeArtifactId=<archetype-artifactId> \
  4. -DarchetypeVersion=<archetype-version> \
  5. -DgroupId=<my.groupid> \
  6. -DartifactId=<my-artifactId>

例如:

  1. $ mvn archetype:generate \
  2. -DgroupId=com.ultrapower.maven.archetypes \
  3. -DartifactId=springboot-maven-archetype \
  4. -DarchetypeArtifactId=maven-archetype-archetype \
  5. -DinteractiveMode=false \
  6. -X

生成后的项目
image.png

常用的maven archetype

如果只是一个模块,或者不需要web容器的支持,那就是maven-archetype-quickstart即可

如果是一个web工程,那可以用maven-archetype-webapp

自己写一个archetype

用eclipse提供的向导,常见一个maven工程,选择的archetype是maven-archetype-archetype,就是用来创建archetype的一个模板

熟悉archetype自己的pom.xml

创建一个maven工程,将其改造为archetype需要的格式
archetype自己也需要一个pom.xml,用来定位自己的坐标

  1. <groupId>com.zhss.maven.archetypes</groupId>
  2. <artifactId>maven-archetype-parent</artifactId>
  3. <version>1.0.0</version>

要生成的项目的pom.xml

接着编写src/main/resources/archetype-resources/pom.xml,就是基于这个archetype生成的项目的pom.xml,里面要注意的是要用到一些占位符,因为生成项目的时候,groupId和artifactId之类的都是用户输入的,这个就是最终生成的项目的pom.xml文件。里面可以放入任何你需要的依赖和插件。

  1. <groupId>${groupId}</groupId>
  2. <artifactId>${artifactId}</artifactId>
  3. <version>${version}</version>
  4. <name>${artifactId}</name>

下面放入依赖、插件以及部署等通用的信息

定义archetype的元数据

接着要编写src/main/resources/META-INF/maven/archetype-metadata.xml

  1. <?xml version=”1.0 encoding=”UTF-8”?>
  2. <archetype-descriptor name=”parent”>
  3. <fileSets>
  4. <fileSet filtered=”true” packaged=”true”>
  5. <directory>src/main/java</directory>
  6. <includes>
  7. <include>**/*.java</include>
  8. </includes>
  9. </fileSet>
  10. <fileSet filtered=”true” packaged=”true”>
  11. <directory>src/test/java</directory>
  12. <includes>
  13. <include>**/*.java</include>
  14. </includes>
  15. </fileSet>
  16. <fileSet filtered=”true” packaged=”true”>
  17. <directory>src/main/resources</directory>
  18. <includes>
  19. <include>**/*.properties</include>
  20. </includes>
  21. </fileSet>
  22. </fileSets>
  23. <requiredProperties>
  24. <requiredProperty key=”port” />
  25. <requiredProperty key=”groupId”>
  26. <defaultValue>com.zhss</defaultValue>
  27. </requiredProperty>
  28. </requiredProperties>
  29. </archetype-descriptor>

这个文件两个作用
第一个作用是定义将这个archetype中的哪些java代码和测试代码以及资源文件,都包含到创建好的项目中去;
第二个作用是定义创建项目的时候需要输入的参数是什么

编写要给新项目的java代码、测试代码以及资源包和配置文件s

src/main/java之类的,对应的目录是src/main/resources/archetype-resources/src/main/java子目录中的代码,在这里可以写你要预先给好的代码
src/test/java,对应的目录是src/main/resources/archetype-resources/src/test/java子目录中的代码,就是你预先给好的测试代码
src/main/resources之类的,对应的目录是src/main/resources/archetype-resources/src/main/resources目录,在这里给好你预先包含的配置文件
filtered参数表示是否对文件启用占位符替换,packaged表示是否将文件放到包路径下。因为package是创建项目的时候必须输入的,就是你的包基础路径。一般是需要将代码放到包路径下的,而资源文件不需要放到包路径下。
默认情况下,会要求输入groupId,artifactId,version,package也可以自己额外定义要求输入的参数,都可以在资源文件或者代码中使用${}的占位符方式来引用
同时对于你写的一些基础的类,一般是可以用package占位符的,到时候创建出来就会替换package

比如说

  1. package ${package}
  2. public class Application {
  3. }

部署arthcetype到私服

mvn clean deploy安装到本地仓库和私服,都可以使用了

用archetype创建一个工程

然后就可以用

  1. $ mvn archetype:generate \
  2. -DarchetypeGroupId=com.zhss.archetypes \
  3. -DarchetypeArtifactId=archetype-oa \
  4. -DarchetypeVersion=1.0.0

然后会提示输入各种参数,就会生成一个项目

archetype catalog

也可以做到不需要输入archetype的坐标就可以使用,就是要将archetype加入一个archetype列表供用户选择,这个archetype列表就是在archetype-catalog.xml文件中。
maven默认会从几个地方去读取archetype-catalog.xml的内容:

  1. internal:maven-archetype-plugin内置了几十个archetype
  2. local:从~/.m2/archetype-catalog.xml读取,默认不存在,要自己创建
  3. remote:读取maven中央仓库的archetype-catalog.xml,大概有几百个archetype
  4. file:读取本机任何一个文件
  5. http:读取任何一个网络上的文件

默认maven会从local+remote去读取archetype列表供选择
可以用mvn archetype:crawl来自动化扫描本地仓库中的archetype,然后生成一份archetype-catalog.xml,放在~/.m2/目录下,但是一般不用这种方式。
除非呢你是要做一个开源的archetype,对不对,然后才去关注这个东西,或者是你写了一个archetype,要整合到eclipse里面去,这种都很麻烦,冷门的知识,我都不想讲。

pom.xml标签

<scm><issueManagement>相关的东西,是跟一个releases插件搭配使用,每次要发布一个版本的时候,有一个自动化做各种检查,以及更新版本号的一个插件,跟git仓库结合起来使用。
<ciManagement>是跟jenkins持续集成结合起来讲解。
<site>这个一些开源项目比较常用,在公司里做项目很少说基于他的site去生成文档。

知识总结

maven课程总结.xmind.zip
maven.png

参考资料

  1. https://maven.apache.org/guides/mini/guide-creating-archetypes.html
  2. https://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.htm
  3. https://blog.51cto.com/dengshuangfu/2344615?source=dra