Maven Archetype

article/2025/10/1 6:15:37

目录

  • Maven Archetype工程结构
  • 创建Maven Archetype
  • 创建支持生成多模块的Maven Archetype
  • 在idea中添加自定义Maven Archetype

最开始接触到maven archetype,是在通过idea创建project时,可以选择Maven -> Create from archetype,
在输入project的GAV后,就可以很方便的初始化一个maven工程,如下图:
在这里插入图片描述
Maven Archetype(原型)是代码工程的抽象(模版),它本身也是一种遵循特定规范的maven project,
通过Maven Archetype定义出project的骨架、模版,然后通过mvn archetype:generate命令可以快速的生成project,
使用Maven Archetype的好处如下:
(1)规范化组织内部的project结构、标准、依赖(即定义可复用的最佳实践)
(2)使开发者可以方便、快速地生成project

Maven Archetype工程结构

archetype本身也是一个maven工程,但是较普通maven工程的3个不同之处如下:
1、根pom需要添加org.apache.maven.archetype:archetype-packaging扩展packaging为maven-archetype

<?xml version="1.0" encoding="UTF-8"?>
<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>com.baeldung.archetypes</groupId><artifactId>maven-archetype</artifactId><version>1.0-SNAPSHOT</version><name>maven-archetype</name><!-- packaging为maven-archetype --> <packaging>maven-archetype</packaging><description>Archetype used to generate rest application based on jaxrs 2.1</description><build><extensions><!-- 添加org.apache.maven.archetype:archetype-packaging扩展 --><extension><groupId>org.apache.maven.archetype</groupId><artifactId>archetype-packaging</artifactId><version>${archetype-packaging.version}</version></extension></extensions><!--.... --></build><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><archetype-packaging.version>3.0.1</archetype-packaging.version></properties></project>

2、src/main/resources/archetype-resources
archetype-resources目录下放的即为模版代码、模版配置文件、模版pom等等,
通过archetype创建工程时会将此目录的模版拷贝到新生成的工程中,
在此目录的文件均可通过${propName}引用archetype-metadata.xml中配置的属性,
且存在如下几个常用的特殊属性:
(1)groupId、artifactId、version对应新建project的maven GAV(即对应mvn archetype:create -DgroupId, -DartifactId, -Dversion参数)
(2)rootArtifactId对应多模块项目的parent模块的artifactId
(3)package对应代码包(即groupId指定的包结构)

3、src/main/resources/META-INF/maven/archetype-metadata.xml
用于描述archetype元数据metadata(包括待拷贝的模版文件、属性…)的描述文件

maven-archetype工程目录示例如下:

archetype-root
├── pom.xml  "archetype工程本身的pom"
└── src└── main├── java└── resources ├── archetype-resources "需要生成的代码、配置、pom模板"│   ├── pom.xml│   └── src└── META-INF└── maven└── archetype-metadata.xml "archetype描述文件"

archetype-metadata.xml示例如下:

<archetype-descriptorxsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsdhttp://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"name="${artifactId}"><!-- 定义属性requiredProperties.requiredProperty(支持多个),key对应属性名称,defaultValue指定属性的默认值,archetype-resources下的模版文件可以通过${requiredProperty.key}的方式进行引用,可以在执行mvn archetype:create时通过-DpropKey的形式进行设置,如下为-Dname=sam--><requiredProperties><requiredProperty key="name"><defaultValue>tom</defaultValue></requiredProperty></requiredProperties><!--指定archetype-resources下的哪些文件被用于生成新project(即需要被拷贝到新project),filtered表示是否需要过滤文件,即是否需要将占位符${propKey}替换为具体属性值,packaged表示需要创建package对应的目录层级--><fileSets><fileSet filtered="true" packaged="true"><directory>src/main/java</directory><includes><include>**/*.java</include></includes></fileSet></fileSets><!--若想生成多module项目,则需通过modules配置多个module,具体使用可参见下文的【创建支持生成多模块的Maven Archetype】--><modules><module name="sub-module"></module></modules></archetype-descriptor>

创建Maven Archetype

创建archetype有2中方式,
1、手动创建maven project, 然后添加之前提到archetype的特定依赖(pom、src/resources/archetype-resources、src/resources/META-INF/maven/archetype-metadata.xml)
2、通过mvn archetype:generate命令自动生成archetype
如下命令指定使用org.apache.maven.archetypes:maven-archetype-archetype,生成com.luo:luo-archetype的maven archetype工程

mvn archetype:generate -B ^-DarchetypeGroupId=org.apache.maven.archetypes ^-DarchetypeArtifactId=maven-archetype-archetype ^-DgroupId=com.luo ^-DartifactId=luo-archetype

执行命令后生成工程目录结构如下:
在这里插入图片描述
注:
自动方式用的不熟,文件名、pom依赖也有点奇怪😂
都是手动创建,又或者将其他的archetype拷贝后进行修改

创建非多模块工程的archetype可以参见 baeldung/maven-archetype上的示例,
我已经将单独的archetype示例上传到Github/marqueeluo/maven-archetype-Baeldung-demo上,其目录结构如下图:
在这里插入图片描述

要创建自己的archetype,可以直接clone该项目,需要修改的地方主要包括:
1、在archetype-resources/src/main/java下编写java模板
其中java文件直接放在archetype-resources/src/main/java目录下,java文件中通过package ${package};设置包,
具体的包目录创建可通过在archetype-metadata.xml设置packaged=true来进行自动创建且包名同groupId
在这里插入图片描述

2、在archetype-resource/src/main/resources编写配置文件模板
示例中的配置文件单独放在liberty/config,但是spring生态更喜欢放在resources目录下,
在将配置文件放在resources目录之后,还需修改archetype-metadata.xml中fileSet.directory为src/main/resources

    <fileSets>...<fileSet><directory>src/main/resources</directory></fileSet></fileSets>

3、在archetype-resource下编写工程的pom.xml模板
即修改模板工程的pom文件
4、修改archetype-metadata.xml描述文件,配置属性、模板文件拷贝

具体的修改位置参见下图,且在1、2、3步骤中均可通过${propKey}的形式引用archetype-metadata.xml requiredProperties中定义的属性
在这里插入图片描述

创建支持生成多模块的Maven Archetype

创建支持生成多模块的Maven Archetype示例,可参见我之前创建的github/marqueeluo/openfeign-archetype,
该archetype创建一个支持openfeign接口定义的多模块项目,项目的模块定义如下:
API: openfeign接口定义(支持springMvc contract)、参数定义、返回结果定义
SERVICE: 依赖API,具体的业务逻辑实现,同时亦可依赖其项目的API模块,通过FeignClient形式调用其他服务
WEB: 依赖SERVICE,实现API中定义的Openfeign接口,并调用SERVICE模块处理业务
在这里插入图片描述

创建多module archetype的关键点就是rootArtifactId的使用,
1、在模块目录中使用"__rootArtfactId__"占位符
maven会自动替换其为全局的artifactId,即在执行mvn archetype:generate -DartifactId时设置的artifactId
在这里插入图片描述
2、在模板pom中使用${rootArtifactId}表示全局artifactId
根(parent)模板pom.xml

<projectxmlns="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>pom</packaging><description>Demo project for Openfeign</description><modules><module>${rootArtifactId}-api</module><module>${rootArtifactId}-service</module><module>${rootArtifactId}-web</module></modules>...<dependencyManagement><dependencies><!-- 管理模块依赖 --><dependency><groupId>${groupId}</groupId><artifactId>${rootArtifactId}-api</artifactId><version>${project.version}</version></dependency><dependency><groupId>${groupId}</groupId><artifactId>${rootArtifactId}-service</artifactId><version>${project.version}</version></dependency><dependency><groupId>${groupId}</groupId><artifactId>${rootArtifactId}-web</artifactId><version>${project.version}</version></dependency></dependencies></dependencyManagement></project>

子模块pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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"><parent><groupId>${groupId}</groupId><artifactId>${rootArtifactId}</artifactId><version>${version}</version></parent><modelVersion>4.0.0</modelVersion><artifactId>${artifactId}</artifactId><dependencies><!-- 依赖api --><dependency><groupId>${groupId}</groupId><artifactId>${rootArtifactId}-api</artifactId></dependency></dependencies></project>

3、在archetype-metadata.xml中配置多module及其对应的模板文件

<archetype-descriptorxsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsdhttp://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"name="${artifactId}">...<modules><module id="${rootArtifactId}-api" dir="__rootArtifactId__-api" name="${rootArtifactId}-api"><fileSets><fileSet filtered="true" packaged="true" encoding="UTF-8"><directory>src/main/java</directory></fileSet><fileSet encoding="UTF-8"><directory>src/main/resources</directory></fileSet><fileSet filtered="true" packaged="true" encoding="UTF-8"><directory>src/test/java</directory></fileSet><fileSet encoding="UTF-8"><directory>src/test/resources</directory></fileSet></fileSets></module><module id="${rootArtifactId}-service" dir="__rootArtifactId__-service" name="${rootArtifactId}-service"><fileSets><fileSet filtered="true" packaged="true" encoding="UTF-8"><directory>src/main/java</directory></fileSet><fileSet encoding="UTF-8"><directory>src/main/resources</directory></fileSet><fileSet filtered="true" packaged="true" encoding="UTF-8"><directory>src/test/java</directory></fileSet><fileSet encoding="UTF-8"><directory>src/test/resources</directory></fileSet></fileSets></module><module id="${rootArtifactId}-web" dir="__rootArtifactId__-web" name="${rootArtifactId}-web"><fileSets><fileSet filtered="true" packaged="true" encoding="UTF-8"><directory>src/main/java</directory></fileSet><fileSet encoding="UTF-8"><directory>src/main/resources</directory></fileSet><fileSet filtered="true" packaged="true" encoding="UTF-8"><directory>src/test/java</directory></fileSet><fileSet encoding="UTF-8"><directory>src/test/resources</directory></fileSet></fileSets></module></modules></archetype-descriptor>

之后即可在各自的模块目录下定义对应的代码、配置等等,
如果需要在${package}下再创建子包,如package ${package}.api;
则可以在对应的archetype-resources/…/src/main/java下新建api文件夹,然后其下的代码中均通过package ${package}.api;形式定义包即可
在这里插入图片描述

archetype项目编写完成后,即可install本地maven仓库、deploy远程maven私服,
然后通过如下命令生成新的openfeign项目

# 其中-DarchetypeGroupId、-DarchetypeArtifactId、-DarchetypeVersion为archetype工程所对应的GAV
# 而-DgroupId、-DartifactId、-Dversion为新生成project对应的GAV
# 亦可通过-D设置archetype-metadata.xml requiredProperties中定义的属性
# -DoutputDirectory设置生成代码的输出目录,默认命令执行目录
mvn archetype:generate -DarchetypeGroupId=com.luo.openfeign.archetypes ^-DarchetypeArtifactId=openfeign-archetype ^-DarchetypeVersion=1.0.0-SNAPSHOT ^-DoutputDirectory=D:/luo-demo ^-DgroupId=com.luo.demo ^-DartifactId=openfeign-demo-new ^-Dversion=1.0.0-SNAPSHOT

在idea中添加自定义Maven Archetype

创建Project,点击菜单File -> New -> Project 后,选择Maven类型并点击add Archetype
在这里插入图片描述
输入archetype的GAV并点击OK
在这里插入图片描述

如上添加自定义archetype后,既可在下次新建project时选择自定义的maven archetype,
输入新生成project的GAV
在这里插入图片描述
点击下一步即可编辑相关属性(在archetype-meta.xml requiredProperties中定义的属性)
在这里插入图片描述
点击Finish后即可使用自定义的archetype创建新的工程

参考:
https://www.baeldung.com/maven-archetype
multi-module-maven-archetypes
https://maven.apache.org/guides/mini/guide-creating-archetypes.html


http://chatgpt.dhexx.cn/article/t1T7mm8x.shtml

相关文章

自定义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…

Maven 三种archetype说明

新建Maven project项目时,需要选择archetype。 那么,什么是archetype? archetype的意思就是模板原型的意思,原型是一个Maven项目模板工具包。一个原型被定义为从其中相同类型的所有其它事情是由一个原始图案或模型。名称配合,因为我们正在努力提供一种系统,该系统提供了…

maven中archetype(原型)的使用及创建

当我们在idea中创建项目时&#xff0c;经常会见到如下界面选择&#xff1a; archetype也就是原型&#xff0c;准确说是一个项目模板&#xff0c;我们可以根据该模板来生成项目。 我就不介绍图形界面的创建方式了&#xff0c;一步一步太啰嗦了&#xff0c;我们用命令方式创建。…

创建自定义的archetype(项目模板)

一、archetype简介 Archetype是一个Maven项目的模板工具包&#xff0c;它定义了一类项目的基本架构。Archetype为开发人员提供了创建Maven项目的模板&#xff0c;同时它也可以根据已有的Maven项目生成参数化的模板。通过archetype&#xff0c;开发人员可以很方便地将一类项目的…

Maven创建时archetype的选择说明

新建Maven project项目时&#xff0c;需要选择archetype。 那么&#xff0c;什么是archetype&#xff1f; archetype的意思就是模板原型的意思&#xff0c;原型是一个Maven项目模板工具包。一个原型被定义为从其中相同类型的所有其它事情是由一个原始图案或模型。名称配合&am…

Maven的Archetype简介

简单的说&#xff0c;Archetype是Maven工程的模板工具包。一个Archetype定义了要做的相同类型事情的初始样式或模型。这个名称给我们提供来了一个一致的生成Maven工程的方式。Archetype会帮助作者给用户创建Maven工程模板&#xff0c;并给用户提供生成相关工程模板版本的参数化…

c语言学习--强制类型转换

C语言中关于强制类型转换问题 由于朋友问到&#xff0c;所以整理了一份&#xff0c;若关于一些认识有错误还望指出...... ● 如果一个运算符两边的运算数类型不同&#xff0c;先要将其转换为相同的类型&#xff0c;即较低类型转换为较高类型&#xff0c;然后再参加运算&#xf…

列举三种强制类型转换

1 强制类型转换—String 这里主要列举了两种强制转换为字符串类型的方法&#xff0c;我们也在log控制台中验证了新的类型。 但是注意&#xff1a;null 和 undefined 这两个值没有 toString()方法。 2 强制类型转换—Number 这里我为大家列举了三种方法&#xff0c;但是注意后…

C语言(强制类型转换)

一.类型转换原则 1.升级&#xff1a;当类型转换出现在表达式时&#xff0c;无论时unsigned还是signed的char和short都会被自动转换成int&#xff0c;如有必要会被转换成unsigned int(如果short与int的大小相同&#xff0c;unsigned short就比int大。这种情况下&#xff0c;uns…

如何进行强制类型转换?

1、自动类型转换 自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换&#xff0c;这种转换不需要程序员干预&#xff0c;会自动发生。 1) 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换&#xff0c;例如&#xff1a; float f 100; 100 是 i…

Java中的强制类型转换

尽管自动类型转换是很方便的&#xff0c;但并不能满足所有的编程需要。 例如&#xff0c;当程序中需要将 double 型变量的值赋给一个 int 型变量&#xff0c;该如何实现呢&#xff1f; 显然&#xff0c;这种转换是不会自动进行的&#xff01;因为 int 型的存储范围比 doub…

C++的四种强制类型转换

目录 1、C语言中的类型转换 2、为什么C需要四种类型转换 3、C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 4、RTTI&#xff08;了解&#xff09; 5、常见面试题 1、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#…

Java中强制类型转换

Java中强制类型转换 一、整型强转 类型转换都是小范围向大范围转换的&#xff0c;大范围往小范围转化需要用到强制转换&#xff0c;转换后的值会有所损失。 不同数据类型精度由小到大排列如下&#xff1a;char-->byte --> short --> int --> long --> float --…

(强制)类型转换方法

目录 一、C语言中的类型转换 二、C中的强制类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 2.5 总结 一、C语言中的类型转换 在C语言中&#xff0c;若赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或…

rgba 兼容性处理

根据caniuse&#xff08;http://caniuse.com/#searchrgba&#xff09;&#xff0c;rgba兼容性为IE9以及以上浏览器。 实例代码&#xff1a; 1 <!doctype html>2 <html lang"en">3 4 <head>5 <meta charset"UTF-8" />6…

rgba无效php,ValueError:无效的RGBA参数:导致此错误的原因是什么?

我正在尝试使用来自:this stackoverflow post的想法创建一个三维彩色条形图。 首先,我使用以下代码创建一个三维条形图:import numpy as np import matplotlib.colors as colors import matplotlib.cm as cm import matplotlib.pyplot as plt from mpl_toolkits.mplot3d imp…

scss @for与rgba函数巧妙使用

SCSS for与rgba函数使用 这里再次记录下~~~ 文章目录 SCSS for与rgba函数使用效果图templatejsscss其他用法each参数变量...占位符选择器 %fooat-root 效果图 template <template><view class"list"><view class"item" :class"[item-…

RGBA: 了解

RGBA: 了解 rgba&#xff08;0&#xff0c;0&#xff0c;0&#xff0c;0&#xff09;四个值&#xff0c;前三个值的范围是0~255之间的整数或0-100的百分数 前三个值&#xff0c;描述的是三原色&#xff0c;最后一个则代表透明度选值在0~1之间&#xff1a; 0 表完全透明 0.5…

CSS3 RGBA颜色

前面我们一起探讨了一下CSS3 Gradient&#xff08;css3 渐变&#xff09;&#xff0c;今天我们一起来探讨一下CSS3中的RGBA。RGB对于大家来说一点不陌生&#xff0c;他就是红色R绿色G蓝色B&#xff0c;那现在我们所说的RGBA又是什么呢&#xff1f;说得简单一点就是在RGB的基础上…

CSS3 RGBA

转载自&#xff1a;http://www.w3cplus.com/content/css3-rgba 前面我们一起探讨了一下CSS3 Gradient&#xff08;css3 渐变&#xff09;&#xff0c;今天我们一起来探讨一下CSS3中的RGBA。RGB对于大家来说一点不陌生&#xff0c;他就是红色R绿色G蓝色B&#xff0c;那现在我们…