“工于利其事,必先善其器”。在通过Jakarta EE和MicroProfile构建微服务项目之前,先构建客户化的maven archetype,这样每次就能自动生成包含java ee 8和MicroProfile相关的依赖和配置。
什么是Maven Archetype
简言之,Archetype就是Maven项目的模板工具。它定义了初始的样式和模型其它相同项目可以以此为基础来构建,比如quickstart archetype可以帮助快速构建maven项目,同样的如果有javaee8和MicroProfile的archetype那么相应的依赖包,配置都已经提供,可以快速生成一个工程。这可以大大提升开发的效率,可以专注于业务代码的编写,而无需重新手动配置依赖,可以节省时间,同时后续相同项目可以重用。详细的maven archetype解释,可以参考官网。
创建Archetype
构建archetype的过程是相对直接的。整体的流程可以简单通过下图来表示:
图为构建客户化 Archetype的整个流程
- 创建archetype工程
- 客户化工程
- 编译archetype jar包
- 使用客户化的archetype创建最终期望的JAVA EE8和MicroProfile工程骨架
一个maven archetype工程包含:
- archetype描述文件 (archetype.xml 在目录: src/main/resources/META-INF/maven/)。它包含所有的archetype使用的文件以及相应的分类,比如配置,源文件等,这样才能正确被archetype生成器识别。
- 项目原型文件 archetype插件会进行拷贝(src/main/resources/archetype-resources/)
- 项目原型pom (pom.xml位于: src/main/resources/archetype-resources)用于生成最终项目的pom.xml样例
- archetype pom 位于客户化archetype项目的根目录,跟其它maven项目一致。
Maven Archetype工程的目录结构如下:
archetype
|-- pom.xml
`-- src
`-- main
`-- resources
|-- META-INF
| `-- maven
| `--archetype.xml
`-- archetype-resources
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- App.java
`-- test
`-- java
`-- AppTest.java
自动生成maven archetype样例工程
在了解了maven archetype的一些基本信息,现在就开始创建javaee 8 和MicroProfile合一的客户化archetype。有两种方式可以生成项目一般的手动构建如上说的archetype目录结果,可以参考官网。这种方式在这就不描述了。
下面通过mvn CLIming的方式命令的方式生成archetype 样例工程。
mvn archetype:generate -B -DarchetypeArtifactId=maven-archetype-archetype -DgroupId=com.chrisopal -DartifactId=javaee8-microprofile-archetype -Dversion=0.0.1 -Dpackage=package
archetypeArtifactId是用到的maven archetype
groupId,artifactId, version, package等参数跟一般maven项目没有任何区别。
客户化相关文件
生成的项目结构跟前面所示的结构相同,为了适配java ee 8和MicroProfile开发的需求,需要做相应的调整,最终的archetype项目结构如下:
javaee8-microprofile-archetype
|-- pom.xml
`-- src
`-- main
`-- resources
|-- META-INF
| `-- maven
| `--archetype-metadata.xml
`-- archetype-resources
|-- pom.xml
|-- README.md
|-- Dockerfile
|-- openliberty
`--server.xml
`-- src
|-- main
| `-- java
| `-- com.chrisopal.resource
| `-- greeting
| `-- GreetingResource.java
| `-- Health
| `-- LivenessCheck.java
| `-- GreetingApplication.java
| `-- webapp.WEB-INF
| `-- beans.xml
- archetype-metadata.xml文件是archetype描述文件,主要描述哪些文件是最终项目的骨架需要的, 所有涉及的文件都在archetype-resource下面。
src/main/java
**/*.java
src/main/resources
**/*.xml
**/*.properties
src/main/webapp
**/*.xml
**/*.properties
.gitignore
openliberty
server.xml
README.md
Dockerfile
buildAndRun.sh
- pom.xml 最终骨架项目的pom文件。主要放置了java ee和microprfile的相关依赖。
4.0.0
${groupId}
${artifactId}
${version}
war
javax
javaee-api
8.0
provided
org.eclipse.microprofile
microprofile
2.1
pom
provided
${artifactId}
1.8
1.8
false
- openliberty 因为最终java ee 8和MicroProfile的运行时是OpenLiberty,这里放的是相应的server配置信息。
- Dockerfile文件是用于生成基于openliberty服务器的docker镜像。我们只需copy生成的thinwar即可,满足云原生的CI/CD需求。
- buildAndRun.sh简单的脚本用于编译,生成docker镜像和运行docker容器。
编译生成Archetype JAR包
运行打包,生成的archetype会被装载到本地的maven仓库。
mvn clean install
使用Archetype
使用Archetype有两种方式,一是直接通过命令行生成工具,而是通过IDE工具。
命令行工具
通过mvn CLI命令运行:
mvn archetype:generate \
-DarchetypeGroupId=com.chrisopal \
-DarchetypeArtifactId=javaee8-microprofile-archetype \
-DarchetypeVersion=0.0.1 \
-DgroupId=com.demo \
-DartifactId=hello-javaee8mp
IDE工具
无论用Eclipse还是IntelliJ IDEA,都需要生成archetype-catalog.xml
。通过执行命令 mvn archetype:crawl
它会扫描maven仓库目录下面所有的jar包,一般在~/.m2/repository下面。然后生成archetype-catalog.xml
文件:
?xml version="1.0" encoding="UTF-8"?>
org.apache.maven.archetypes
maven-archetype-archetype
1.0
archetype
com.chrisopal
javaee8-microprofile-archetype
0.0.1
javaee8-microprofile-archetype
IDEA导入请参考这里; Eclipse通过Preference>Maven>Archetype>Add Local Catalog
导入生成的文件,然后就可以进行选择。
总结
本文描述了如何通过客户化maven archetype,生成Java EE 8和MicroProfile工程用于快速构建微服务和云原生应用,相应的代码可以在Github找到。
参考
- http://maven.apache.org/guides/mini/guide-creating-archetypes.html
- https://www.youtube.com/watch?time_continue=276&v=5yylEMAAfRE
- https://github.com/sdaschner/coffee
- https://github.com/AdamBien/microprofile-essentials-archetype