如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)

1、背景

最近,由于要将一些老系统逐步进行架构升级,需要 0 开始搭建一些微服务,这个虽然难度不大,我们通常的做法就是把一个已有的 Project 改改名字,删删减减一些文件等等,整个过程还是比较琐碎,很容易出错导致整个项目启动失败,而且,这样 copy 过来的老 Project,会残存一些不需要的垃圾配置和代码,导致新的 Project 就不那么整洁了。

为了更好的解决这些问题,我打算采用一个一劳永逸的办法去解决 TA —— 那就是通过一个工具自动创建一个符合司内项目规范的 Project。经朋友提醒 Idea 有这样的功能,上网简单查了下,果然 ,Idea 基于 Maven archetype 能够根据一个原型 Project 创建一个新的 Project。

既然已经有了这样的工具,一向不喜欢造*的我,拿来直接用就好了!!!

2、步骤

  1. 首选需要我们自己创建一个原型项目,例如:annoroad-lightning,注意 pom.xml 文件中需要增加 maven-archetype-plugin 插件 ,如下图:如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
  2. 根据【步骤1】新建的原型项目(annoroad-lightning)生成 archetype,如下图:
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
    运行 archetype:create-from-project 的结果,如下图:
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
  3. 以【步骤2】生成的 target/generated-sources/archetype/pom.xml 中的 artifactId
    为项目名(例如:annoroad-lightning-archetype),创建一个空的 Project,然后将【步骤2】中生成的所有文件(也就是 target/generated-sources/archetype/ 下所有的文件)都 copy 过来到这个空的 Project 中,如下图:
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
  4. 将根据原型项目(annoroad-lightning)生成的 archetype(annoroad-lightning-archetype),通过 Maven 打成 jar 包,并发布到 Maven 的私服上(Nexus),因为不是本文的重点,所以就不在这里讲解了!
  5. 至此一个 archetype 就创建完成了,如何使用 archetype 去创建一个Project 也不是本文的重点,所以这里也不赘述了:)!

3、碰到的问题

根据原型项目(annoroad-lightning)直接生成的 archetype(annoroad-lightning-archetype),有时候还是不能满足我们的全部需求,例如:

  1. annoroad-lightning 中 src/main/docker/Docker 文件在生成的 archetype 中有丢失的问题
  2. annoroad-lightning 中 src/main/k8s/annoroad-xxx-deployment.yaml、src/main/k8s/annoroad-xxx-deployment-test.yaml 两个文件的文件名中的 annoroad-xxx 如何能够自动替换成新建项目根目录下的 pom.xml 文件的 artifactId
  3. annoroad-lightning 中 src/main/k8s/annoroad-xxx-deployment.yaml、src/main/k8s/annoroad-xxx-deployment-test.yaml 两个文件内容中的 annoroad-xxx 如何能够自动替换成新建项目根目录下的 pom.xml 文件的 artifactId
  4. 同【问题3】,annoroad-lightning 中 src/main/k8s/test.secret、src/main/k8s/product.secret 两个文件内容中的 annoroad-xxx 如何能够自动替换成新建项目根目录下的 pom.xml 文件的 artifactId

为了解决以上的问题,我们需要修改 annoroad-lightning-archetype 中 src/main/resources/META-INF.maven/archetype-metadata.xml 文件中的内容,如下图:
如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)

Ok,让我们来逐条解决以上的问题吧(基本上是看图说话)

  1. 针对【问题1】,如下图:
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
  2. 针对【问题2】,如下图:
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
  3. 针对【问题3】,如下图:
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)
  4. 【问题4】和【问题3】相同,只是将 annoroad-xxx-deployment.yaml、annoroad-xxx-deployment-test.yaml 换成了 product.secret、test.secret,如下图:
    如何基于 Maven Archetype 创建一个原型项目(以原型项目作为项目模板生成一个新项目)