如何开发一个项目脚手架

220 阅读3分钟

创建一个项目通常需要依赖很多的二/三方组件,我们很难记住每个组件的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
  1. 创建为maven模版项目
mvn clean archetype:create-from-project
  1. 使用指定的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命令创建模版项目。

截屏2022-06-14 13.34.39.png

然后,我们就可以基于生成的模版项目去实现更多的定制化功能了。例如,实现按需勾选依赖组件功能。

截屏2022-06-14 13.34.46.png

前端获取可选依赖库展示,后端根据前端传递的用户勾选的依赖项,先读取项目的pom.xml依赖配置文件,写入勾选的依赖的maven坐标。再根据勾选的依赖,添加初始化代码,以及添加配置项。 例如在Main类上添加@EnableXxx注解,在application.yaml配置文件中添加配置项。

其中的难点是如何修改pom.xml配置文件、application.yaml配置文件,以及如何修改java源码文件。读写xml文件可使用dom4j组件实现,读写yaml文件可使用snakeyaml组件实现,而修改java源码文件可使用javaparser组件实现。

最后,将模版项目压缩成jar包,响应jar包的下载链接给前端,前端使用下载链接生成下载按钮。