美文网首页
为Java EE 8和MicroProfile构建客户化Mave

为Java EE 8和MicroProfile构建客户化Mave

作者: chrisopal | 来源:发表于2019-02-19 10:08 被阅读0次

    “工于利其事,必先善其器”。在通过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找到。

    参考

    相关文章

      网友评论

          本文标题:为Java EE 8和MicroProfile构建客户化Mave

          本文链接:https://www.haomeiwen.com/subject/rzcxyqtx.html