自定义idea archetype

编写 archetype 元数据

通过plugin从现有项目中导出

1、引入plugin

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-archetype-plugin</artifactId>
                <version>3.2.0</version>
            </plugin>

2、通过maven命令生成archetype元数据

  • 在cmd中执行
mvn archetype:create-from-project
  • 在idea中执行

在这里插入图片描述

生成的archetype元数据在 目录:target\generated-sources\archetype 下。

├─src
│  ├─main
│  │  └─resources
│  │      ├─archetype-resources
│  │      │  ├─.idea
│  │      │  │  ├─inspectionProfiles
│  │      │  │  └─sonarlint
│  │      │  │      └─issuestore
│  │      │  ├─frame-api
│  │      │  │  └─src
│  │      │  │      └─main
│  │      │  │          └─java
│  │      │  │              └─cloud
│  │      │  │                  └─frame
│  │      │  │                      ├─dto
│  │      │  │                      ├─feign
│  │      │  │                      └─vo
│  │      │  └─frame-biz
│  │      │      └─src
│  │      │          └─main
│  │      │              ├─java
│  │      │              │  ├─cloud
│  │      │              │  │  └─frame
│  │      │              │  │      ├─config
│  │      │              │  │      ├─constant
│  │      │              │  │      ├─controller
│  │      │              │  │      ├─exception
│  │      │              │  │      ├─mapper
│  │      │              │  │      ├─model
│  │      │              │  │      ├─service
│  │      │              │  │      │  └─impl
│  │      │              │  │      ├─util
│  │      │              │  │      └─vo
│  │      │              │  ├─mapper
│  │      │              │  ├─model
│  │      │              │  └─service
│  │      │              │      └─impl
│  │      │              └─resources
│  │      └─META-INF
│  │          └─maven
│  └─test
│      └─resources
│          └─projects
│              └─basic

注意,通过现有项目生成会出现以下问题:

  • 如果源代码中仅有package,而没有类文件,则此package对应的目录会丢失。
  • 有些文件例如:.gitignore会丢失
  • 生成的模块名称是固定的

因此要对现有archetype进行调整

手工编写

手工编写也是生成上面的archetype,但是可以进行调整,主要包括:

增加一些变量,更精确的进行控制

增加一些文件

生成 archetype

在目录target\generated-sources\archetype 下执行 以下命令

#本地安装
mvn install 
#远程发布
mvn deploy

在根目录下执行

#把本地仓库中所有的可用archetype 展示出来
mvn archetype:crawl

使用archetype

在Idea中使用

1、添加archetype

groupId=com.jurassic   
artifactId=jurassic-frame-archetype 
version=2.0.0 

在这里插入图片描述

2、通过archetype创建项目

在这里插入图片描述

删除自定义archetype

在 下面文件中有对应记录,删除重启IDEA即可

# C:\Users\{用户}\.IntelliJIdea2018.2\system\Maven\Indices\

<archetypes>
  <archetype groupId="com.jurassic" artifactId="jurassic-frame-archetype" version="1.0.0" />
</archetypes>

命令行

mvn archetype:generate     -DarchetypeGroupId=com.jurassic   -DarchetypeArtifactId=jurassic-frame-archetype  -DarchetypeVersion=2.0.0 -DprojectName=test

可以给每个属性在命令行中设置参数,如果没有设置,则会提示输入参数值,有默认值的直接回车即可

交互

[INFO] Generating project in Interactive mode
[WARNING] No archetype found in remote catalog. Defaulting to internal catalog
[INFO] Archetype repository not defined. Using the one from [com.jurassic:jurassic-frame-archetype:2.0.0] found in catalog local
[INFO] Using property: groupId = com.jurassic
[INFO] Using property: projectName = Test
Define value for property 'artifactId' cloud-Test: :
Define value for property 'version' 1.0-SNAPSHOT: : 2.0.0
Define value for property 'package' com.jurassic.cloud.Test: :
Confirm properties configuration:
groupId: com.jurassic
projectName: Test
artifactId: cloud-Test
version: 2.0.0
package: com.jurassic.cloud.Test
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: jurassic-frame-archetype:2.0.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.jurassic
[INFO] Parameter: artifactId, Value: cloud-Test
[INFO] Parameter: version, Value: 2.0.0
[INFO] Parameter: package, Value: com.jurassic.cloud.Test
[INFO] Parameter: packageInPathFormat, Value: com/jurassic/cloud/Test
[INFO] Parameter: package, Value: com.jurassic.cloud.Test
[INFO] Parameter: version, Value: 2.0.0
[INFO] Parameter: projectName, Value: Test
[INFO] Parameter: groupId, Value: com.jurassic
[INFO] Parameter: artifactId, Value: cloud-Test
[INFO] Parent element not overwritten in E:\codes\cloud-test\cloud-Test\cloud-Test-api\pom.xml
[INFO] Parent element not overwritten in E:\codes\cloud-test\cloud-Test\cloud-Test-biz\pom.xml
[INFO] Project created from Archetype in dir: E:\codes\cloud-test\cloud-Test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 44.414 s
[INFO] Finished at: 2021-01-07T15:22:33+08:00
[INFO] ------------------------------------------------------------------------
[WARNING] The requested profile "env-dev" could not be activated because it does not exist.

如果不想用交互模式,则设置参数: -DinteractiveMode=false


mvn archetype:generate  -DinteractiveMode=false   -DarchetypeGroupId=com.jurassic   -DarchetypeArtifactId=jurassic-frame-archetype  -DarchetypeVersion=2.0.0 -DprojectName=Test

archetype详细介绍

文件详解

  • 根目录下的pom.xml和一般的maven项目一样主要定义archetype项目的坐标等信息。
  • 所有的项目骨架内容都集中在src/main/resources/archetype-resources文件夹下。
  • archetype-resources中的pom.xml定义了待生成项目的pom文件的内容,/src/main/java、/src/test/java中分别定义了待生成项目中相应目录下的内容
  • /src/main/resources/META-INF/maven/archetype-metadata.xml中定义相关的元数据描述(其中该文件的位置固定为resources/META-INF/maven文件夹下,且名称固定为archetype-metadata.xml)。
  • target\generated-sources\archetype\src\test\resources 目录下为插件测试用的配置,如果有自定义参数,需要修改projects\basic\archetype.properties 文件信息

根目录下pom.xml

  <groupId>com.jurassic</groupId>
  <artifactId>jurassic-frame-archetype</artifactId>
  <version>2.0.0</version>
  <packaging>maven-archetype</packaging>

  <name>jurassic-frame-archetype</name>

/**/archetype-resources/pom.xml

    <parent>
        <groupId>com.jurassic</groupId>
        <artifactId>jurassic-cloud</artifactId>
        <version>2.0.0-RELEASE</version>
    </parent>

    <groupId>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <version>${version}</version>

    <packaging>pom</packaging>

POM中 ${}标识的变量都是通过maven中的命令行传进来的 ,idea操作会通过输入框输入。

 mvn archetype:generate -DgroupId=com.jurassic 

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 http://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd" name="jurassic-frame"
    xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <fileSets>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>.idea/inspectionProfiles</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>.idea</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </fileSet>
        ... ... 
        <fileSet encoding="UTF-8">
            <directory/>
            <includes>
                <include>.gitignore</include>
                <include>jurassic-frame.iml</include>
                <include>readme.md</include>
            </includes>
        </fileSet>
    </fileSets>
    <requiredProperties>
        <requiredProperty key="groupId">
            <defaultValue>com.jurassic</defaultValue>
        </requiredProperty>
        <requiredProperty key="artifactId">
            <defaultValue>cloud</defaultValue>
        </requiredProperty>
        <requiredProperty key="package">
            <defaultValue>com.jurassic.cloud</defaultValue>
        </requiredProperty>
    </requiredProperties>
    <modules>
        <module id="${rootArtifactId}-api" dir="__rootArtifactId__-api" name="${rootArtifactId}-api">
           ... ... 
        </module>
        <module id="${rootArtifactId}-biz" dir="__rootArtifactId__-biz" name="${rootArtifactId}-biz">
          ... ... 
        </module>
    </modules>
</archetype-descriptor>

说明:

  • packaged="true"标识src/main/resources/archetype-resources/src/main/java中对应的内容是否要放入到package中,比如package为com.jurassic,那么如果该属性为true,则对应的java文件会放到com/jurassic文件夹下,也就是包路径下。
  • filtered="true"标识下面提到的**${}是否要进行替换**

module有三个属性,解释如下:
id :定义子模块工程的artifactId.
dir :子模块工程源文件在archetype-resources里对应的directory.
name :子模块的名字.

类文件

#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
package ${
    
    package}.constant;

public class T1Constant {
    
    
}

${package}是包名变量。

变量/属性

  • “ __rootArtifactId__ ”占位符会被parent项目的***artifactId***替换,主要用于路径中
  • ${rootArtifactId}也会被parent项目的artifactId替换,主要用于文件中
  • src/main/resources/archetype-resources里必须要有一个顶级pom文件(如果是单工程就是工程pom文件),同时子文件夹代表了模块定义
    <requiredProperties>
        <requiredProperty key="groupId">
            <defaultValue>com.jurassic</defaultValue>
        </requiredProperty>
        <requiredProperty key="artifactId">
            <defaultValue>cloud</defaultValue>
        </requiredProperty>
        <requiredProperty key="package">
            <defaultValue>com.jurassic.cloud</defaultValue>
        </requiredProperty>
    </requiredProperties>

这些属性可以在资源元文件里的任意一个文件里通过${var}来引用,所以的元文件最终都可以选择通过velocity引擎来执行替换后生成。
默认的属性有:groupId,artifactId,packeage,version等

文件名或者路径中包含 _property_ 则会被属性值替换

注意:如果打包(install deploy等)时,报错说:没有在archetype.properties定义你定义的自定义属性。Missing required properties in archetype.properties: ,是因为集成测试模块造成,请在src/test/resources/projects/basic/archetype.properties中添加对应的属性即可解决。

参考

http://maven.apache.org/archetype/maven-archetype-plugin/specification/archetype-metadata.html

http://maven.apache.org/archetype/archetype-models/archetype-descriptor/archetype-descriptor.html

https://blog.csdn.net/zp820705/article/details/103852642

.gitignore文件丢失

通过变量解决:

1.首先修改下你的.gitignore文件名为(注意是两个_)

__gitignore__

2.在你的archetype-metadata.xml中添加

<requiredProperties>
    <requiredProperty key="gitignore">
        <defaultValue>.gitignore</defaultValue>
    </requiredProperty>
</requiredProperties>
<fileSets>
        <fileSet encoding="UTF-8">
          <directory></directory>
          <includes>
            <include>.editorconfig</include>
            <include>__gitignore__</include>
          </includes>
        </fileSet>
</fileSets>

3.在对应的test包中archetype.properties中添加变量默认值

gitignore=.gitignore

参考:https://blog.csdn.net/dj7858177/article/details/111948017

猜你喜欢

转载自blog.csdn.net/demon7552003/article/details/112344225