零 楔子
最近在看低代码平台和流水线相关的一些东西,看到一些平台会提供自动生成代码库的能力,顺藤摸瓜,正好回顾一下maven的能力,并在这里做一些尝试和验证。
maven中的archetype:archetype是骨架的意思,maven的archetype是Maven工程的模板工具包,定义了要做的相同类型事情的初始样式或模型。archetype给我们提供来了一个一致的生成Maven工程的方式,帮助作者给用户创建Maven工程模板,并给用户提供生成相关工程模板版本的参数化方法。
一 背景
目前开发的后端工程,基本都是java语言的,maven工程。依赖spring(sprintboot)框架,所以一个比较容易想到的就是,如果我想做一个平台支持自动创建java语言的代码库,那么maven是第一选择。接下来就是工程模板,在idea中创建新项目工程时,大部分时候是直接next创建,但也可以勾选下图 中的"Create from archetype"使用已有的archetype创建:
二 自定义archetype
首先,我们创建一个新的工程,或者使用已有工程(差别不大,重点在于后续我们用自定义的骨架生成代码后,对比看骨架和生成工程的目录结构是否一致)。我这里是用了一个历史工程,目录结构如下:
接下来,参照maven自定义archetype的操作说明:
2.1 pom.xml中添加archetype插件
在pom.xml中,<build><plugins>标签下新增如下配置:
代码语言:javascript复制<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.2.0</version>
</plugin>
代码语言:javascript复制
注意version信息,为了避免后续执行时报错,可以在添加后,执行maven reload project来看是否可以正常加载插件:
2.2 执行archetype生成
需要执行maven archetype相关命令。这里也有两个选择,如下图4在idea右侧的maven上,点击 标红位置的m按钮:
也可以直接在terminal中执行maven命令:
mvn archetype:create-from-project
执行结果如下:
在工程根目录下生成一个target目录(注意:这里跟maven构建配置有关,有些会输出到output目录)。
2.3 自定义archetype安装到本地仓库
进入target/generated-sources/archetype目录,执行mvn install
代码语言:javascript复制[INFO] Project created from Archetype in dir: /Users/xxx/develop/github/websocket/target/generated-sources/archetype/target/test-classes/projects/basic/project/basic
[INFO]
[INFO] --- maven-install-plugin:3.0.1:install (default-install) @ Java-WebSocket-archetype ---
[INFO] Installing /Users/xxx/develop/github/websocket/target/generated-sources/archetype/pom.xml to /Users/xxx/.m2/repository/org/java-websocket/Java-WebSocket-archetype/1.5.4-SNAPSHOT/Java-WebSocket-archetype-1.5.4-SNAPSHOT.pom
[INFO] Installing /Users/xxx/develop/github/websocket/target/generated-sources/archetype/target/Java-WebSocket-archetype-1.5.4-SNAPSHOT.jar to /Users/xxx/.m2/repository/org/java-websocket/Java-WebSocket-archetype/1.5.4-SNAPSHOT/Java-WebSocket-archetype-1.5.4-SNAPSHOT.jar
[INFO]
[INFO] --- maven-archetype-plugin:3.2.0:update-local-catalog (default-update-local-catalog) @ Java-WebSocket-archetype ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.683 s
[INFO] Finished at: 2022-09-04T13:01:40 08:00
[INFO] ----------------------------------------
代码语言:javascript复制
其中打印出了使用的工程目录,以及安装目录
三 使用自定义archetype创建新工程
3.1 idea方式
这里还是先使用idea创建,点击add archetype:
找到上一步创建好的archetype目录(如果不记得,可以进入maven本地仓库目录,然后通过包名和工程明查找即可),
其中maven-metadata-local.xml中记录了版本等信息,打开这个xml文件:
把groupId, artifactId, version等信息填写到上面的窗口,点击ok后完成添加:
next后,填写新工程的groupId, artifactId等信息即可:
创建后工程如下:
3.2 maven命令
通过idea创建,还是手工操作。我们希望可以通过命令实现,这样可以在实际应用中通过shell等脚本衔接,实现自动化创建工程。
与上面:
代码语言:javascript复制mvn archetype:generate -B
-DarchetypeGroupId=org.java-websocket
-DarchetypeArtifactId=Java-WebSocket-archetype
-DarchetypeVersion=1.5.4-SNAPSHOT
-DgroupId=com.learn.archetype
-DartifactId=my-project
-Dversion=1.0-SNAPSHOT
为了避免冲突,这里定义的工程名为 my-project,命令执行结果:
idea打开工程:
四 总结
本章整理了使用maven archetype生成自定义骨架和工程初始化方法。后续会再探讨代码自动生成技术,欢迎大家关注、交流。