专栏首页TECH flower使用Maven Archetype创建Java项目模板

使用Maven Archetype创建Java项目模板

1.over view

简而言之,Archetype是一个Maven项目模板工具包。原型被定义为一种原始的模式或模型,所有其他同类的东西都是从中产生的。当我们试图提供一个提供生成Maven项目的一致方法的系统时,这个名字就合适了。Archetype将帮助作者为用户创建Maven项目模板,并为用户提供生成这些项目模板的参数化版本的方法。

使用原型提供了一种很好的方法,可以与您的项目或组织所采用的最佳实践一致的方式快速地使开发人员受益。您可能希望在组织内部实现J2EE开发的标准化,因此您可能希望提供EJB,WAR或Web服务的原型。一旦创建了这些原型并将其部署在组织的存储库中,组织中的所有开发人员就可以使用它们。


2.do it

⚠️:我们将使用springboot项目来演示如何生成一个maven archetype(原型),本文中(模板)(原型)交替使用,二者意思相同。

示例,我们有一个现成的项目,其结构如下:

.
├── Dockerfile
├── README.md
├── last-demo.iml
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── demo
    │   │           └── data
    │   │               ├── Application.java
    │   │               └── your_business_package
    │   │                   ├── client
    │   │                   │   └── DemoClient.java
    │   │                   ├── constants
    │   │                   │   └── YourBusinessConstants.java
    │   │                   ├── enumerate
    │   │                   │   └── DemoStatus.java
    │   │                   ├── presistence
    │   │                   │   ├── DemoRepository.java
    │   │                   │   └── entity
    │   │                   │       └── DemoDO.java
    │   │                   ├── service
    │   │                   │   └── DemoService.java
    │   │                   └── web
    │   │                       ├── dto
    │   │                       │   └── DemoDTO.java
    │   │                       └── rest
    │   │                           └── DemoController.java
    │   └── resources
    │       ├── application.yml
    │       └── logback-spring.xml
    └── test
        ├── java
        │   └── com
        │       └── demo
        │           └── data
        │               └── ApplicationTests.java
        └── resources
            └── application.yml

我们将使用maven archetype来创建以该项目为基础的模板。

2.1 生成模板文件夹

执行以下maven命令:

mvn archetype:create-from-project

此时项目中会生成target/generated-sources/archetype文件夹,其中存放的就是我们的模板相关文件。

2.2 自定义模板

探索target/generated-sources/archetype我们可以得知:

generated-sources
    └── archetype
        ├── pom.xml
        ├── src
        │   ├── main
        │   │   └── resources
        │   │       ├── META-INF
        │   │       │   └── maven
        │   │       │       └── archetype-metadata.xml ##⚠️原型描述符,描述了我们原型的结构
        │   │       └── archetype-resources ##⚠️经过maven转换后的项目文件包
        │   └── test
        │       └── resources
        │           └── projects
        │               └── basic
        └── target
            ├── classes
            │   └── archetype-resources
            ├── your_project_name.jar
            └── test-classes
                └── projects
                    └── basic

我们随机打开一个archetype-resources中的源文件,可以看到如下:

上图中我们看到的${package}占位符,这个就是maven原型插件自动处理的结果,到时候我们根据原型生成项目的时候,这些占位符就会变成我们新生成项目的相关的值。类似,maven还提供了groupId,artifactId, version等关键字。如果我们项目中有其他地方也需要这种定制化,我们可以手动进行更改。

例如我们把项目配置文件改为如下(应用名用占位符代替),目的是实现项目的名称随新建的项目变动。

接下来来分析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">
  <fileSets>
    <fileSet filtered="true" packaged="true" encoding="UTF-8">
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.java</include>
      </includes>
    </fileSet>
    <fileSet filtered="true" encoding="UTF-8">
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.xml</include>
      </includes>
    </fileSet>
    <fileSet filtered="true" encoding="UTF-8">
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.yml</include>
      </includes>
    </fileSet>
    <!--下面还有更多项-->

⚠️:fileSet属性标签指定的那些文件需要纳入原型中,我们把不需要的删掉。

⚠️:filtered属性标签表示是否替换文件中的占位符,若为true则会替换,否则不会,所以我们如果想要占位符最后会被替换为项目相关的信息,还需要通过这个标签指定

⚠️:packaged属性标签指定文件是否在项目的包里面,true或false。

2.3 生成模板(原型)

我们进入target/generated-sources/archetype目录,执行以下命令:

mvn install

此时模板将在我们本地生成。

2.4 使用模板(原型)生成新项目

我们使用以下命令:

  1. mvn archetype:generate \
  2. -DarchetypeCatalog=local \
  3. -DgroupId=新建项目的groupId \
  4. -DartifactId=新建项目的artifactId \
  5. -DarchetypeGroupId=你的原型group \
  6. -DarchetypeArtifactId=你的原型项目名字-archetype \
  7. -DarchetypeVersion=你的原型版本 \
  8. -DinteractiveMode=false

之后,我们会生成新项目。项目的结构符合我们的原型结构。查看我们手动指定的application.yml

可以看到我们的占位符被我们项目的相关信息给替换了。

2.5 将模板上传至maven仓库

我们进入target/generated-sources/archetype目录,打开pom.xml

添加仓库信息:

<distributionManagement>
    <repository>
        <id>my-releases</id>
        <url>你的仓库地址</url>
    </repository>
    <snapshotRepository>
        <id>my-snapshots</id>
        <url>你的仓库地址</url>
    </snapshotRepository>
</distributionManagement>
<servers>
    <server>
        <id>my-snapshots</id>
        <username>对应仓库的username</username>
        <password>对应仓库的password</password>
    </server>
    <server>
        <id>my-releases</id>
        <username>对应仓库的username</username>
        <password>对应仓库的password</password>
    </server>
</servers>

随后指定如下命令:

mvn deploy

随后,原型将被上传至你的mavne仓库。


3.summary

本文我们介绍的maven的原型及其特性带来的好处,并且我们演示了如何生成一个原型,并且利用原型来创建一个新项目。

本文分享自微信公众号 - TECH flower(tech-flower),作者:东溪陈姓少年

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [译]高性能缓存库Caffeine介绍及实践

    本文我们将介绍Caffeine-一个Java高性能缓存库。缓存和Map之间的一个根本区别是缓存会将储存的元素逐出。逐出策略决定了在什么时间应该删除哪些对象,逐出...

    东溪陈姓少年
  • AOP编程简介及其在Spring框架中的使用

    AOP与OOP互为补充,面向对象编程(OOP)将程序分解成各个层次的对象;面向切面编程(AOP)则是将程序运行过程中分解成各个切面。可以说OOP是从静态角度考虑...

    东溪陈姓少年
  • Spring Boot2+Resilience4j实现容错之Bulkhead

    Resilience4j提供了两种舱壁模式(Bulkhead),可用于限制并发执行的次数:

    东溪陈姓少年
  • 快速学习Maven-Maven工程搭建

    cwl_java
  • java8 stream操作集合

    IT云清
  • CentOS7上静默(silent)模式安装Oracle12C Release 2 (12.2)

    版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://b...

    shaonbean
  • 美化Windows Mobile上的自定义ListView

        在移动设备上,我们经常需要列出数据给用户看,ListView是经常用到的控件。而有些时候,我们需要同时列出预览的图片和数据,所谓图文并茂,这样可以带来更...

    ShiJiong
  • 腾讯云FLV AV1扩展以及FFmpeg修改说明

    腾讯云对FLV协议部分做了扩展,用于支持FLV AV1的直播场景,并在FFmpeg 4.1.3/4.2中做了对应的实现,具体细节如下:

    腾讯云视频
  • PAT 1040

    字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)...

    ShenduCC
  • 1760:菲波那契数列(2)

    1760:菲波那契数列(2) 总时间限制: 1000ms 内存限制: 65536kB描述菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数...

    attack

扫码关注云+社区

领取腾讯云代金券