一、前言
要新建一个SpringBoot项目,少不了要在yml中对dev环境、生产环境的各类中间件进行配置,并且有一些如全局异常捕获之类的代码少不了要花一阵功夫复制黏贴
而对于一个通过gitlab集成了ci/cd,部署在k8s上的应用来说,还需要为每个新建的项目编写.gitlab-cli.yml 以及k8s的部署脚本,比如笔者部门就是每个项目都要包含这些东西,以下是部分截图
pom.xml
有较多的重复性的复制粘贴批量修改工作,这样就很让人烦躁了,虽说大家都是CRUD工程师,但是能偷懒的话还是想尽量偷点懒的
二、正文
因为无论是yml配置,还是.gitlab-ci.yml 还是 kubernetes的部署yml,其实几乎都是只和artifactId有关联的模板代码,自己手动复制粘贴替换的其实也就是这些内容
笔者在研究了一阵子各类模板引擎以后,发现模板引擎通常只能够生成项目代码文件,而非整个项目本身,后来发现Maven的项目骨架比较能满足需求,就自己动手尝试了
2.1 通过Maven自定义骨架实现项目初始化
1. 创建一个SpringBoot Maven骨架
首先创建一个Maven项目,可以通过maven骨架 maven-archetype-webapp 生成一个简单的项目
配置项目根目录下pom.xml,这个是骨架的maven定义
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<artifactId>rcs-archetype</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-archetype</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>${project.artifactId}</finalName>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>2.4</version>
</extension>
</extensions>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<!--私库配置,若要远程部署则需要-->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>releases</name>
<url>http://10.1.xx.69:8081/nexus/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>snapshots</name>
<url>http://10.1.xx.69:8081/nexus/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
其中需要注意打包方式要修改为<packaging>maven-archetype</packaging>
groupId、artifactId和version自己按需更改
2. 项目文件填充
注意,通过骨架要生成的项目文件都要放在相对路径为src\main\resources\archetype-resources
的 archetype-resources
目录下
例如生成的项目根目录下的项目依赖pom.xml就在骨架项目的
src\main\resources\archetype-resources\pom.xml
项目代码文件src\main\java\...
就在src\main\resources\archetype-resources\src\main\java\...
结构举例:
│
└─src
├─main
│ ├─java
│ └─resources
│ ├─archetype-resources (都在这下面)
│ │ │ └─pom.xml
│ │ │
│ │ └─src
│ │ └─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─xxx
│ │ │ └─test1
│ │ │ └─Application.java
│ │ └─resources
│ │ └─application.yml
│ └─META-INF
│ └─maven
│ └─archetype-metadata.xml
│
└─test
└─java
3. 项目文件参数替换规则
- 文件内容文本替换: 使用
${}
格式,如${artifactId}
- 文件名、文件夹名替换使用
__artifactId__
格式,例如__artifactId__-pro.yml
4. 定义要被生成的文件,要被替换参数的文件
注意,为了避免误替换,避免引入不必要的文件,若不做配置,上面在指定目录archetype-resources创建的文件在生成时会被忽略,定义的占位符也不会被替换成正确的参数
为了正确生成项目代码,需要在src\main\resources\META-INF\maven\
目录下创建文件archetype-metadata.xml
archetype-metadata.xml
定义了模板的元信息
<?xml version="1.0" encoding="UTF-8" ?>
<archetype-descriptor
xsi:schemaLocation="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0 http://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd"
name="web_common_demo_project"
xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<requiredProperties>
<requiredProperty key="groupId">
<defaultValue>com.xxx</defaultValue>
</requiredProperty>
<requiredProperty key="k8sNamespace">
<defaultValue>origin</defaultValue>
</requiredProperty>
<requiredProperty key="version">
<defaultValue>0.0.1-SNAPSHOT</defaultValue>
</requiredProperty>
<requiredProperty key="artifactIdUnderlineCase">
<defaultValue>
${artifactId.replaceAll("-","_")}
</defaultValue>
</requiredProperty>
<requiredProperty key="artifactIdCommaCase">
<defaultValue>
${artifactId.replaceAll("-|_",".")}
</defaultValue>
</requiredProperty>
<requiredProperty key="artifactIdPath">
<defaultValue>
${artifactId.replaceAll("-|_","/")}
</defaultValue>
</requiredProperty>
</requiredProperties>
<fileSets>
<fileSet filtered="true" packaged="false" encoding="UTF-8">
<directory>src/main/java/com/xxx/__artifactIdPath__</directory>
</fileSet>
<fileSet filtered="true" packaged="false" encoding="UTF-8">
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<directory>src/test/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
<include>**/*.yaml</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>k8s</directory>
<include>*.yml</include>
</fileSet>
<fileSet filtered="false" encoding="UTF-8">
<directory></directory>
<includes>
<include>README.md</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory></directory>
<includes>
<include>.gitignore</include>
<include>.gitlab-ci.yml</include>
</includes>
</fileSet>
</fileSets>
</archetype-descriptor>
<requiredProperty>
定义了需要的参数以及默认值
<fileSet>
定义了要被识别的文件集,其属性filtered
代表是否要对匹配的文件内容做过滤(参数替换),属性packaged
指明匹配的文件其目录是否可做变更。<directory>
指定路径,<include>
指定文件匹配规则
更多的可以参考ArchetypeDescriptor
生成效果展示
三、要点总结
- 要生成的项目文件都放在骨架项目的
src\main\resources\archetype-resources
目录下 - 文件内容、文件名、文件夹名的替换占位符规则
${x}
,__x__
- 在
src\main\resources\META-INF\maven\
目录下创建文件archetype-metadata.xml
定义模板的元信息,包含需要的参数、要被扫描的文件、要被替换参数的文件
随便叨叨
用下来还是感觉真香的,笔者还特地搞了个多模块版本
但是它的的适用性更多的在和公司开发体系相结合,自动按骨架结构生成对应的各种文件,如仅个人学习使用感觉作用不大
参考资料(有部分错误,笔者踩坑了)
https://blog.csdn.net/lusyoe/article/details/62442408
//www.greatytc.com/p/4d1e856cd1f7
https://www.cnblogs.com/vingLiu/p/12153885.html