本篇文章写于2022年06月14日,从公众号|掘金|CSDN手工同步过来(博客搬家),本篇为原创文章。
创建一个项目通常需要依赖很多的二/三方组件,我们很难记住每个组件的maven坐标,并且有些组件的初始化工作很繁琐,一堆配置项很难记住。如果没有脚手架,每当需要创建一个新的project,我们通常会选择基于现有的project复制一份,然后修改修改。
如果是纯粹的只使用spring的三方组件就能创建一个project,那么我们完全可以使用start.spring.io提供脚手架,但通常我们都会自己写一些二方组件,或者基于三方组件封装二方组件,然后发布到公有/私有maven仓库,这时我们就需要定制一个适用于自己/公司技术栈的new project脚手架了。
maven提供了基于项目模版创建新项目的能力,即maven项目脚手架。当我们在idea->new maven project时,idea也会提示我们是否根据模版创建项目,并提供了一些可选的模版,只是这些模版都不适合我们。但我们可以自己定制maven项目模版。
以下就是自己开发一个maven模版项目,并将模版项目上传到私有仓库,最后根据模版创建新项目的步骤。
- 1.按正常项目开发,开发一个模版项目,假设项目坐标如下。
groupId=com.wujiuye.microservices.template
artifactId=microservices-template
version=1.0.0
- 2.创建为maven模版项目,执行下面命令。
mvn clean archetype:create-from-project
创建出来的模版项目,坐标的artifactId会被加上-archetype
后缀,变成:
groupId=com.wujiuye.microservices.template
artifactId=microservices-template-archetype
version=1.0.0
- 3.将模版项目上传到模版仓库。
进入/target/generated-sources/archetype目录下,修改pom.xml配置文件,添加私有仓库配置:
<distributionManagement>
<repository>
<id>release</id>
<url>http://{{我们自己搭建的nexus maven私有仓库的域名}}/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://{{我们自己搭建的nexus maven私有仓库的域名}}/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
进入/target/generated-sources/archetype目录下,执行下面命令上传archetype
mvn clean deploy
- 4.通过模版创建项目,执行下面命令。
mvn -X archetype:generate -B \
-DarchetypeGroupId=${替换为模版的groupId,例如:com.wujiuye.microservices.template} \
-DarchetypeArtifactId=${替换为模版的artifactId,例如:microservices-template-archetype} \
-DarchetypeVersion=${替换为模版的version} \
-DgroupId=${替换为项目groupId} \
-DartifactId=${替换为项目artifactId} \
-Dversion=${替换为项目version} \
-Dpackage=${替换为项目package} \
执行以上命令也可以使用临时的mvn环境变量,使用临时的mvn环境,如下:
- 1.先配置临时mvn环境。
M2_HOME=/Users/wujiuye/projects/microservices-initializr/apache-maven
export PATH=$PATH:$M2_HOME/bin
- 2.创建为maven模版项目。
mvn clean archetype:create-from-project
- 3.使用指定的settings.xml文件,将模版项目上传到模版仓库。
同样需要进入/target/generated-sources/archetype目录下,修改pom.xml配置文件,添加私有仓库配置,再执行下面的命令。
cd target/generated-sources/archetype
mvn clean deploy --settings /Users/wujiuye/.m2/settings.xml
maven提供的脚手架功能还是相对简单的,我们只能替换下项目的groupId、artifactId、version、package这些。但我们可以基于此,开发一个更完善的脚手架,并提供像start.spring.io提供的勾勾点点就能自动生成项目的一个脚手架网页。
首先,我们创建一个web项目,然后将根据maven模版坐标创建模版项目的功能封装到web项目。提供一个api,前端调用一下,就通过执行shell脚本,执行mvn -X archetype:generate
命令创建模版项目。
然后,我们就可以基于生成的模版项目去实现更多的定制化功能了。例如,实现按需勾选依赖组件功能。
前端获取可选依赖库展示,后端根据前端传递的用户勾选的依赖项,先读取项目的pom.xml依赖配置文件,写入勾选的依赖的maven坐标。再根据勾选的依赖,添加初始化代码,以及添加配置项。 例如在Main类上添加@EnableXxx注解,在application.yaml配置文件中添加配置项。
其中的难点是如何修改pom.xml配置文件、application.yaml配置文件,以及如何修改java源码文件。读写xml文件可使用dom4j组件实现,读写yaml文件可使用snakeyaml组件实现,而修改java源码文件可使用javaparser组件实现。
最后,将模版项目压缩成jar包,响应jar包的下载链接给前端,前端使用下载链接生成下载按钮。