Maven自定义Archetype项目模板

article/2025/10/1 5:51:21

前言:在某课网上学习到可以使用命令mvn archetype:create-from-project来创建自己的项目模板(文中提及的项目模板即 原型 archetype),对此我十分感兴趣。但是,遗憾的是,老师没有介绍如何去构建这样一个特殊的项目,用于创建项目模板。于是,本着面向“度娘”编程的原则,去网上查了下,结果不是十多年前的“古董”文章,就是流程不清楚,有的需要部署到私服,有的包含大量jar包,十分繁琐。项目的组成也不清楚,连最重要的文件archetype-metadata.xml都不介绍。因此,想写一篇简单易懂的文章来介绍下这部分内容。

一、项目结构

        为了方便理解,本文将基于Maven 3(ver3.6.3)和IntelliJ IDEA 2021环境展开。项目简介:本archetype项目模板为webapp的模板,对maven自带的webapp做了部分更符合实际开发情况的修改。例如,修改了web.xml中约束2.3(dtd)为3.1(xsd)、在pom.xml中添加了开发必要的依赖servlet和jsp的api等等。

1、整体结构

Archetype项目结构如下如图所示,此项目由两部分组成(并且他们都在resources目录下):

1.archetype-resources 目录描述未来你希望生成的项目的模板
2.META-INF/maven/archetype-metadata.xml文件描述模板中文件的相关信息,如应该包含哪些文件,占位符如何替换等

至于,下面这个目录如何创建,你可以先通过模板maven-archetype-quickstart创建项目,然后再手动创建这些目录及文件。
在这里插入图片描述

2、archetype-resources

本部分介绍项目模板中的各文件的内容及注意事项,大部分内容都可以根据自己项目的需要进行配置,为了便于理解,这里使用了最简单、常用的配置。

HelloServlet.java

package ${package};import javax.servlet.http.HttpServlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;@WebServlet(value="/helloServlet", name="helloServlet")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().println("<h1>Hello Servlet!</h1>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().println("<h1>Hello Servlet!</h1>");}
}

注意:类的包名使用了占位符${package},会根据你使用maven创建项目时提供的参数替换此包名,并创建相应目录,将此文件放在包名对应的目录下。本文件通过注解的方式注册了此Servlet,当然在web.xml中配置也可以,不在介绍。


web.xml 修改约束为常用的web3.1版本

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

index.jsp

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

pom.xml (可以根据自己的需要配置)
<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><packaging>war</packaging><groupId>${groupId}</groupId><artifactId>${artifactId}</artifactId><version>${version}</version><name>${artifactId}</name><url>http://maven.apache.org</url><dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version></plugin></plugins></build>
</project>

注意:$ {groupId}、$ {artifactId}、$ {artifactId}等占位符会根据你创建maven项目时指定的参数进行替换。此外,还添加了Sevlet和JSP的依赖及tomcat插件。

3、archetype-metadata.xml(重要)

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="basic"><fileSets><fileSet filtered="true" packaged="true"><directory>src/main/java</directory><includes><include>**/*.java</include></includes></fileSet><fileSet filtered="false"><directory>src/main/webapp</directory></fileSet></fileSets>
</archetype-descriptor>

属性介绍:

  1. archetype-descriptor:项目模板描述符,name属性给本项目模板起了一个名字,不重要;

  2. fileSet:描述了本项目模板包含哪些在archetype-resources中定义的文件,以及对文件如何处理;
    filtered属性决定是否使用 Velocity engine (字面翻译为速度引擎), 如果不使用速度引擎,表示不做任何处理,项目模板中直接包含在directory中定义的目录及文件,如“src/main/webapp”不用做任何处理,所以filtered=“false”;
    如果使用速度引擎,表示在模板中可以通过include指定的模式包含满足条件的文件;更重要的可以使用创建项目时用户提供的参数来替换占位符。如src/main/java下的$ {package}需要被替换,所以filtered=“true”

    packaged属性决定$ {package}是否有效,
    如果packaged=“true”,表示占位符有效,会根据用户创建项目时提供的package参数替换占位符(并且创建包名对应的目录,把该文件放在该目录下,包名和目录要保持一致),如果用户未提供package参数,则使用groupId参数作为包名,推荐使用
    如果package=“false”,表示包名使用“硬编码方式”,即不使用占位符,在java文件中写死包名,如“package
    org.example;”,这种方式十分不灵活,因此不推荐使用

      3.  pom.xml不用在fileSet中指明,会自动包含进入项目模板;

补充属性:

<archetype-descriptor name="basic"><requiredProperties><requiredProperty key="property-with-default"><defaultValue>default-value</defaultValue></requiredProperty><requiredProperty key="property-without-default"/></requiredProperties>
...
</archetype-descriptor>

还可以为创建项目时使用到的必要参数groupId、artifactId、version和package指定默认值,如公司项目的groupId可能是固定的,就可以在这里配置默认值,当在命令行创建项目时,不指定该参数就会使用默认值;

<requiredProperty key="property-without-default"/>表示给必要参数未设置默认值,在命令行创建项目时,必须为该属性提供值;

另外,值得一提的是,如果在这里为package属性设置了默认值,就不会使用groupId作为替换的包名了。换句话说,替换包名占位符的优先级是命令行输入的package参数值>package默认值>groupId。

4、项目根目录下的pom.xml文件

使用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.0http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><packaging>jar</packaging><name>servlet3-webapp-archetype</name><groupId>com.company</groupId><artifactId>servlet3-webapp-archetype</artifactId><version>1.0.0</version>
</project>

二、项目构建

依次在IDEA的Terminal终端窗口中运行下列命令(或者使用IDEA Maven工具):

1. mvn archetype:create-from-project
2. mvn clean install

三、项目测试

最后,测试我们生成的项目骨架是否可用,本次测试使用IDEA工具

1、将自定义模板添加到骨架目录中

在这里插入图片描述

如果添加无效,解决方法参考:IDEA如何添加和删除自定义的Archetype原型

2、选中自己定义模板,然后下一步,填入创建项目必要的参数即可

在这里插入图片描述

3、确认项目信息,最后生成项目

在这里插入图片描述

最后,突发奇想,可以为本模板项目自定义Archetype项目模板,以方便以后定义项目模板使用吗?留给读者自己尝试吧!


参考文章:apache maven官方文档

上文中介绍的用于生成webapp原型的servlet3-webapp-archetype项目,下载地址:

  • CSDN 资源下载(需要一个C币)
  • 百度云盘下载(提取码:1111)

http://chatgpt.dhexx.cn/article/2KwHyOts.shtml

相关文章

Maven-Archetype Catalog

当用户以不指定Archetype坐标的方式使用maven-archetype-plugin的时候&#xff0c;会得到一个Archetype列表供选择&#xff0c;这个列表的信息来源于一个名为archetype-catalog.xml的文件&#xff0c;如&#xff1a; archetype-catlog.xml能提供Archetype的信息&#xff0c;那么…

Idea archetype介绍

一、背景 Idea创建项目时&#xff0c;被一堆archetype混淆视听&#xff0c;犹豫不决决定彻底弄懂他 1.关键词 Archetype: 骨架Maven: Java代码编译时的一个工具&#xff08;软件讲究运行时、和编译时两种状态&#xff09; 2.网友介绍 Archetype是Maven工程的模板工具包。一…

Maven Archetype

目录 Maven Archetype工程结构创建Maven Archetype创建支持生成多模块的Maven Archetype在idea中添加自定义Maven Archetype 最开始接触到maven archetype&#xff0c;是在通过idea创建project时&#xff0c;可以选择Maven -> Create from archetype&#xff0c; 在输入proj…

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