1、背景
最近,由于要将一些老系统逐步进行架构升级,需要 0 开始搭建一些微服务,这个虽然难度不大,我们通常的做法就是把一个已有的 Project 改改名字,删删减减一些文件等等,整个过程还是比较琐碎,很容易出错导致整个项目启动失败,而且,这样 copy 过来的老 Project,会残存一些不需要的垃圾配置和代码,导致新的 Project 就不那么整洁了。
为了更好的解决这些问题,我打算采用一个一劳永逸的办法去解决 TA —— 那就是通过一个工具自动创建一个符合司内项目规范的 Project。经朋友提醒 Idea 有这样的功能,上网简单查了下,果然 ,Idea 基于 Maven archetype 能够根据一个原型 Project 创建一个新的 Project。
既然已经有了这样的工具,一向不喜欢造轮子的我,拿来直接用就好了!!!
2、步骤
- 首选需要我们自己创建一个原型项目,例如:annoroad-lightning,注意 pom.xml 文件中需要增加 maven-archetype-plugin 插件 ,如下图:
- 根据【步骤1】新建的原型项目(annoroad-lightning)生成 archetype,如下图:
运行 archetype:create-from-project 的结果,如下图:
- 以【步骤2】生成的 target/generated-sources/archetype/pom.xml 中的 artifactId
为项目名(例如:annoroad-lightning-archetype),创建一个空的 Project,然后将【步骤2】中生成的所有文件(也就是 target/generated-sources/archetype/ 下所有的文件)都 copy 过来到这个空的 Project 中,如下图:
- 将根据原型项目(annoroad-lightning)生成的 archetype(annoroad-lightning-archetype),通过 Maven 打成 jar 包,并发布到 Maven 的私服上(Nexus),因为不是本文的重点,所以就不在这里讲解了!
- 至此一个 archetype 就创建完成了,如何使用 archetype 去创建一个Project 也不是本文的重点,所以这里也不赘述了:)!
3、碰到的问题
根据原型项目(annoroad-lightning)直接生成的 archetype(annoroad-lightning-archetype),有时候还是不能满足我们的全部需求,例如:
- 原型项目(annoroad-lightning)执行 maven-archetype-plugin 的 create-from-project,src/main/docker/Docker 文件丢失问题。
- 通过 annoroad-lightning-archetype 生成的项目,src/main/docker/Docker 文件有丢失的问题
- 通过 annoroad-lightning-archetype 生成的项目, src/main/k8s/annoroad-xxx-deployment.yaml、src/main/k8s/annoroad-xxx-deployment-test.yaml 两个文件的文件名中的 annoroad-xxx 如何能够自动替换成新建项目根目录下的 pom.xml 文件的 artifactId
- 通过 annoroad-lightning-archetype 生成的项目, 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/test.secret、src/main/k8s/product.secret 两个文件内容中的 annoroad-xxx 如何能够自动替换成新建项目根目录下的 pom.xml 文件的 artifactId
为了解决以上的问题,我们需要修改 annoroad-lightning-archetype 中 src/main/resources/META-INF.maven/archetype-metadata.xml 文件中的内容(注:除了【问题1】),如下图:
Ok,让我们来逐条解决以上的问题吧(基本上是看图说话)
-
针对【问题1】,如下图:
再来看下,我是如何解决这个文件丢失问题的(说起来有点心虚:<)
通过这个现象我们可以发现 maven-archetype-plugin 的 create-from-project 会将无后缀的文件直接过滤掉(具体为啥,没有深究)。说是解决这个问题,不如说是绕过了这个问题,那就是对文件随便加了一个后缀(有点儿恶心了~~),然后在 annoroad-lightning-archetype 中将该文件的后缀去掉,如下图:
最后还要说一下,本示例中的 annoroad-lightning-archetype 使用的版本是 3.0.1,将版本升级到 3.2.0(目前最新版本)还是这个问题。 -
针对【问题2】,如下图:
-
针对【问题3】,如下图:
-
针对【问题4】,如下图:
-
【问题5】和【问题3】相同,只是将 annoroad-xxx-deployment.yaml、annoroad-xxx-deployment-test.yaml 换成了 product.secret、test.secret,如下图: