编写 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