为Java EE 8和MicroProfile构建客户化Maven Archetype

“工于利其事,必先善其器”。在通过Jakarta EE和MicroProfile构建微服务项目之前,先构建客户化的maven archetype,这样每次就能自动生成包含java ee 8和MicroProfile相关的依赖和配置。

什么是Maven Archetype

简言之,Archetype就是Maven项目的模板工具。它定义了初始的样式和模型其它相同项目可以以此为基础来构建,比如quickstart archetype可以帮助快速构建maven项目,同样的如果有javaee8和MicroProfile的archetype那么相应的依赖包,配置都已经提供,可以快速生成一个工程。这可以大大提升开发的效率,可以专注于业务代码的编写,而无需重新手动配置依赖,可以节省时间,同时后续相同项目可以重用。详细的maven archetype解释,可以参考官网

创建Archetype

构建archetype的过程是相对直接的。整体的流程可以简单通过下图来表示:


图为构建客户化 Archetype的整个流程

  1. 创建archetype工程
  2. 客户化工程
  3. 编译archetype jar包
  4. 使用客户化的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下面。
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
        name="javaee8-essentials-archetype"
        xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <fileSets>
        <fileSet filtered="true" packaged="false" encoding="UTF-8">
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" packaged="false" encoding="UTF-8">
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" packaged="false" encoding="UTF-8">
            <directory>src/main/webapp</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </fileSet>

        <fileSet filtered="false" packaged="false" encoding="UTF-8">
            <directory></directory>
            <includes>
                <include>.gitignore</include>

            </includes>
        </fileSet>

        <fileSet filtered="false" packaged="false" encoding="UTF-8">
            <directory>openliberty</directory>
            <includes>
                <include>server.xml</include>
            </includes>
        </fileSet>

        <fileSet filtered="true" packaged="false" encoding="UTF-8">
            <directory></directory>
            <includes>
                <include>README.md</include>
                <include>Dockerfile</include>
                <include>buildAndRun.sh</include>
            </includes>
        </fileSet>

    </fileSets>
</archetype-descriptor>
  • pom.xml 最终骨架项目的pom文件。主要放置了java ee和microprfile的相关依赖。
<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>${groupId}</groupId>
   <artifactId>${artifactId}</artifactId>
   <version>${version}</version>
   <packaging>war</packaging>

   <dependencies>
       <dependency>
           <groupId>javax</groupId>
           <artifactId>javaee-api</artifactId>
           <version>8.0</version>
           <scope>provided</scope>
       </dependency>
       <dependency>
           <groupId>org.eclipse.microprofile</groupId>
           <artifactId>microprofile</artifactId>
           <version>2.1</version>
           <type>pom</type>
           <scope>provided</scope>
       </dependency>
   </dependencies>

   <build>
       <finalName>${artifactId}</finalName>
   </build>
   <properties>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <failOnMissingWebXml>false</failOnMissingWebXml>
   </properties>
</project>
  • 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"?>
<archetype-catalog xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0 http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd"
    xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <archetypes>
    <archetype>
      <groupId>org.apache.maven.archetypes</groupId>
      <artifactId>maven-archetype-archetype</artifactId>
      <version>1.0</version>
      <description>archetype</description>
    </archetype>
    <archetype>
      <groupId>com.chrisopal</groupId>
      <artifactId>javaee8-microprofile-archetype</artifactId>
      <version>0.0.1</version>
      <description>javaee8-microprofile-archetype</description>
    </archetype>
  </archetypes>
</archetype-catalog>

IDEA导入请参考这里; Eclipse通过Preference>Maven>Archetype>Add Local Catalog 导入生成的文件,然后就可以进行选择。

总结

本文描述了如何通过客户化maven archetype,生成Java EE 8和MicroProfile工程用于快速构建微服务和云原生应用,相应的代码可以在Github找到。

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容