maven 工程结构 和 archetype 模板

news2024/12/27 14:01:03

文章目录

  • 一、maven 工程结构
    • 1.1. jar 工程结构
    • 1.2. war 工程结构
  • 二、archetype 模板
    • 2.1. 推荐的 archetype 模板
    • 2.2. 自定义 archetype 模板
      • 2.2.1 自定义模板示例

有没有好奇过,通过 Maven 生命周期命令构建项目时,我们并没有指定源文件目录和编译后的输出目录,为什么 Maven 可以自动能找到它们,并可以正确执行构建任务?

一、maven 工程结构


这是因为我们一直都是按照 Maven 默认的目录结构来创建 Maven 项目的,所以 Maven 在进行构建时就可以找到需要的文件,假设我们随意创建目录结构,这时执行 Maven 生命周期构建命令就不会成功

Maven 的默认目录结构的本质取决于我们构建项目时使用的生命周期插件,也就是说生命周期插件变化时,默认的目录结构也会发生变化,改变 Maven 生命周期插件大概有下面两种方式:

  1. 项目中明确指定构建项目时的生命周期插件
  2. 使用默认的生命周期插件

由于第一种方式的不确定性太大,所以本文主要针对第二种方式的目录结构进行记录

虽然是默认的生命周期插件,但是 Maven 却定义了多个默认的插件,运行生命周期构建命令时,其会根据我们项目中 pom.xml 里的 <packaging> 来决定具体使用的生命周期插件


1.1. jar 工程结构


在项目的 pom.xml 里设置 <packaging>jar</packaging> 时,以 package 阶段为终点,Maven 会默认使用 maven-resources-pluginmaven-compiler-pluginmaven-surefire-pluginmaven-jar-plugin 这几个插件,此时要求的默认目录结构为:

jar初始结构

项目根目录

目录描述是否需要提前准备
pom.xmlMaven 项目的核心文件,配置依赖和构建信息需要
src存放 Java 源文件和资源文件需要
target存放 Maven 执行构建后生成的文件不需要

src 目录

目录描述是否需要提前准备
main存放 Java 源文件和资源文件需要
test存放测试用的 Java 源文件和资源文件按需

main 目录

目录描述是否需要提前准备
java以包路径的形式存放 Java 源文件, compile 阶段会对该目录下的 Java 源文件进行编译需要
resources存放资源文件,process-resources 阶段会复制该目录下的文件按需

test 目录

目录描述是否需要提前准备
java以包路径的形式存放 Java 源文件这里的 Java 源文件一般搭配测试框架 junit 等 ,test-compile 阶段
会对该目录下的 Java 源文件进行编译
按需
resources存放测试用的资源文件,process-test-resources 阶段会复制该目录下的文件按需

target 目录

目录描述是否需要提前准备
classes1. 执行 compile 后会编译 main->java 中的 Java 源文件,并将编译后的二进制文件存放到此
2. 执行 process-resources 后会从 main->resources 中将文件复制过来
不需要
test-classes1. 执行 test-compile 后会编译 test->java 中的 Java 源文件,并将编译后的二进制文件存放到此
2. 执行 process-test-resources 后会从 test->resources 中将文件复制过来
不需要

以上就是 Maven 生成 jar 包时最标准的目录结构(最后生成的 jar 文件的内部结构和 classes 文件夹结构相同)

我们执行一下 package 阶段,看看效果:

jar构建后目录结构

1.2. war 工程结构


在项目的 pom.xml 里设置 <packaging>war</packaging> 时,以 package 阶段为终点,Maven 会默认使用 maven-resources-pluginmaven-compiler-pluginmaven-surefire-pluginmaven-war-plugin 这几个插件,此时要求的默认目录结构为:

war初始结构

项目根目录

目录描述是否需要提前准备
pom.xmlMaven 项目的核心文件,配置依赖和构建信息需要
src存放 Java 源文件和资源文件需要
target存放 Maven 执行构建后生成的文件不需要

src 目录

目录描述是否需要提前准备
main存放 Java 源文件和资源文件需要

main 目录

目录描述是否需要提前准备
java以包路径的形式存放 Java 源文件, compile 阶段会对该目录下的 Java 源文件进行编译需要
resources存放资源文件,process-resources 阶段会复制该目录下的文件按需
webapp这个目录的命名是 Maven 构建 servlet 项目的特点,一般看见 webapp 就知道是 Maven 构建的需要放
到外置容器执行的 servlet web 项目,package 阶段执行时,会复制该目录下的全部内容,该目录的
内部结构需要符合 web 容器的解析结构,既 war 包结构
必须

我们执行一下 package 阶段,看看效果:

war打包后结构

二、archetype 模板


知道了 Maven 项目的标准结构,就可以按照这个结构创建 Maven 项目了,如果觉得创建这些目录结构很繁琐,或者自己经常记不住,那我们也可以使用 mvn archetype:generate 命令,这种方式可以选择别人定义好的模板,然后按照选定的模板自动帮我们创建一个 Maven 项目

2.1. 推荐的 archetype 模板


别人写好的 maven archetype 模板实在是太多了,这里我推荐两个官方发布的

  1. 生成 <packaging>jar</packaging>时的目录结构:maven-archetype-quickstart
  2. 生成 <packaging>war</packaging>时的目录结构: maven-archetype-webapp

使用模板生成项目的命令:

mvn archetype:generate
-DarchetypeGroupId=模板的gourpId
-DarchetypeArtifactId=模板的artifactId
-DarchetypeVersion=模板的version
-DgroupId=要生成的项目的groupId
-DartifactId=要生成的项目的artifactId
-Dversion=要生成的项目的version

指定模板的 groupIdartifactIdversion,和待生成项目的 groupIdartifactIdversion
如果敲命令时不会换行,就把命令敲在同一行

maven-archetype-quickstart 模板为例效果如下:

使用模板生成项目

使用 maven-archetype-quickstart 模板生成项目后的结构如下:

模板生成的项目结构

可以看到生成的目录结构基本算是一个标准的结构了,而且还帮我们生成了一个基础类 App ,剩下的我们按照自己的需求,在这个结构基础上改造就可以了


2.2. 自定义 archetype 模板


如果找不到满意的第三方模板,也可以自己定义一个,这样以后每次生成项目的时候就可以使用自己的模板了

想创建自己的模板,这时候我们 Maven 的目录结构又有新要求了,其核心的目录结构如下:

模板结构


简单介绍下重要的地方:

1.archetype-resources 目录内容,就是我们的模板内容,用来定义模板结构

2.META-INF/maven/archetype.xml 把要生成的文件声明在这个文件中,这个文件也可以命名为 archetype-metadata.xml,
但是语法也会有变化,我个人比较推荐 archetype.xml,感觉语法比较简单


2.2.1 自定义模板示例

现在就演示一下,如何定义一个模板,然后通过这个模板创建项目

1. 按照目录要求,创建模板项目

手动创建或通过已有模板 maven-archetype-archetype 创建都可以,只要最后的结构对了就可以

示例模板结构

2. 定义使用该模板生成项目时的结构和文件

archetype-resources 下,按自己的想法定义结构,下图红框里的结构,就是后期使用这个模板生成的项目结构

添加模板结构

3. 给待生成的文件内填点内容

archetype-resources/src/main/java/config/Config.java 中随便加点代码,其中 ${package} 可以获取到我们通过模板创建时指定的 package,之后生成项目时会自动填充到这里

package ${package}.config;

public class Config {
}

archetype-resources/pom.xml 中随便加点配置, ${groupId} 可以获取到我们通过模板创建时指定的 groupId${artifactId} 可以获取到我们通过模板创建时指定的 artifactId${version} 可以获取到我们通过模板创建时指定的 version

<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>
  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <version>${version}</version>
  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>
  </dependencies>
</project>

4. 定义生成时要输出的文件

META-INF/maven/archetype.xml 中添加配置

<archetype>
  <id>ares5k-archetype</id>
  <sources>
    <source encoding="UTF-8">src/main/java/config/Config.java</source>
  </sources>
  
  <resources>
    <resource encoding="UTF-8">src/main/resources/env.properties</resource>
  </resources>
  
  <testSources>
    <source encoding="UTF-8">src/test/java/config/ConfigTest.java</source>
  </testSources>
</archetype>

5. 安装部署插件

运行 mvn installmvn deploy 将项目打包安装或部署

6. 使用模板,验证生成的结构

正常用 Maven 使用模板的命令就可以了,mvn archetype:generate -DarchetypeGroupId=com.ares5k -DarchetypeArtifactId=ares5k-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.ares5k -DartifactId=test-archetype -Dversion=1.0

使用自定义模板

生成后的结构如下,:

自定义模板生成后的结构

可以看到,生成的结构和我们在 archetype-resources/pom.xml 中定义的结构几乎一样,为啥说是几乎一样呢,因为我们在 archetype-resources 中定义的结构是 src/main/java/config/Config.java,而生成的结构中自动帮我们加上了包名 src/main/java/com/ares5k/config/Config.java,可以说是非常智能,test/java 目录同理也加上了包名

接下来验证一下生成的文件内容:

Config.java 中的 ${package} 被成功的替换成生成时指定的 package

package com.ares5k.config;

public class Config {
}

pom.xml 中的 ${groupId}${artifactId}${version} 也被成功替换

<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>
  <groupId>com.ares5k</groupId>
  <artifactId>test-archetype</artifactId>
  <version>1.0</version>
  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>
  </dependencies>
</project>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5张图告诉你:同样是职场人,差距怎么这么大?

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 在职场中&#xff0c;我们常常会听到各种各样的抱怨&#xff1a; &#x1f469;‍⚖️‍ 小A: 凭什么别人每次述职绩效都是优秀呀&#xff1f; 感觉TA也没干啥呀! &#x1f575; 小B: 凭啥这个事情&#xff0c;领导指派TA去对接呀&#…

“设计模式”概述

设计模式代码样例&#xff1a;Git 设计原则 依赖倒置原则&#xff08;DIP&#xff09; 高层模块&#xff08;稳定&#xff09;不应依赖底层模块&#xff08;变化&#xff09;&#xff0c;二者都应依赖于抽象&#xff08;稳定&#xff09;抽象不应依赖于实现细节&#xff0c;…

YoloV5/YoloV7改进---注意力机制:线性上下文变换LCT,性能优于SE

目录 1.LCT介绍 2.LCT引入到yolov5 2.1 加入common.py中&#xff1a; 2.2 加入yolo.py中&#xff1a; 2.3 yolov5s_LCT.yaml 2.4 yolov5s_LCT1.yaml 3.YOLOv5/YOLOv7魔术师专栏介绍 1.LCT介绍 论文&#xff1a; https://arxiv.org/pdf/1909.03834v2.pdf AAAI 2020 摘要&a…

最长上升子序列 (从dp---->贪心)

最长上升子序列 思路&#xff1a; 题目要求找到最长上升的子序列&#xff0c;那么这个时候&#xff0c;我们可以假以第i个为结尾&#xff0c;那么此时以i为结尾的最大上升子序列是多少。但是这个时候&#xff0c;会发现&#xff0c;从第i个为结尾往前面找的话&#xff0c;是一…

20230705点亮STC32G实验箱9.6(STC32G12K128)开发板的跑马灯LED(深入了解)

08第六集&#xff1a;LED闪烁第六集&#xff1a;LED闪烁和花式点灯上和花式点灯上.mp4 09第六集&#xff1a;LED闪烁和花式点灯下.mp4 【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑 2023/7/5 17:36 delay_ms(3000); 刷机的时候如果使用11.0592M的Fos…

Ardupilot学习笔记

参考文献 【1】https://ardupilot.org 主打的就是一个炫酷 自驾仪 Ardupilot 一套开源的自驾仪&#xff0c;集成了各种各样的代码&#xff0c;包括其他开源代码(如PX4代码)和项目、驱动等。 即&#xff1a;自驾仪即集成了整个可以实现无人载具&#xff08;如无人机&#xff…

Day_61-62 决策树

目录 Day_61-62决策树(准备工作) 一. 算法的基本概念 1. 决策树的定义 2. 如何构建决策树&#xff1f; 2.1 熵 2.2 信息增益原则 2.3 计算步骤 二. 示例演示 1. 第一次节点决策分类&#xff1a; 2. 后续节点的决策分类 3. 决策分类的结束条件 三. 代码实现 1. 主函数 2. 两个构…

Matlab把两个不同的x轴和y轴画在同一个图里

我们知道画两个y轴可以用yyaxis. 那么画两个x轴呢? 这时候可以用神奇的tiledlayout. % 创建两组数据 x1 0:0.1:40; y1 4.*cos(x1)./(x12); x2 1:0.2:20; y2 x2.^2./x2.^3;t tiledlayout(1,1); % 创建一个tiledlayout % 第一个坐标系 ax1 axes(t); % 创建坐标系, 指定t为…

Go语言MinGW的安装

Go语言MinGW的安装 相比在 Linux 平台上安装 GCC 编译环境&#xff0c;在 Windows 平台上安装 MinGW 是比较简单的&#xff0c;只需经历以下几个过 程。 1、MINGW32位安装 1、打开 [MinGW 官网] https://osdn.net/projects/mingw/&#xff0c;下载 MinGW 安装包。 点击即可…

个人对于SAR的粗浅理解

个人对于SAR的粗浅理解 有同学问我是做成像的&#xff0c;让我解释一下SAR成像&#xff0c;我思索了一下&#xff0c;决定这样简单回答&#xff1a; 首先SAR的全称为Synthetic Aperture Radar&#xff0c;即合成孔径雷达&#xff0c;本质还是一种Radar 合成孔径&#xff0c;其…

CSS 制作动态蚂蚁线

效果&#xff1a; 代码&#xff1a; <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <style type"text/css"> .line{position:relative;margin-bottom: 5px;width: 1200px;height: …

【电商API接口系列】关键词搜索商品列表,品牌监控场景

API接口允许不同应用程序之间共享数据&#xff0c;在系统之间传输、读取和更新数据。例如&#xff0c;一个电商网站可以通过API接口获取支付系统的支付状态。API接口允许开发人员使用他人开发的功能来扩展自己的应用程序。通过调用第三方API接口&#xff0c;开发人员无需重新实…

我的创作纪念日兼GPT模型简单介绍

目录 一、引言 二、收获与开端 2.1 问题&#xff1a;在创作的过程中都有哪些收获&#xff1f; 2.2 模型开端 三、日常与深入 3.1 问题&#xff1a;当前创作和你的学习是什么样的关系&#xff1f; 3.2 模型深入介绍 3.2.1 无监督预训练 3.2.2 有监督下游任务精调 四、…

自动驾驶产业链躁动,四维图新能否做好新时代“Tier 1”?

自动驾驶行业的“劲风”又来了。 6月21日&#xff0c;工信部副部长辛国斌在国务院政策例行吹风会上表示&#xff0c;将启动智能网联汽车准入和上路通行试点&#xff0c;他强调&#xff0c;“这里面讲的是L3级&#xff0c;及更高级别的自动驾驶功能商业化应用”。此前工信部曾透…

C#实现低耦合读卡

我们经常要给用户实现读卡查询。有很多种读卡器&#xff0c;每个厂商的接口也不同。归纳为两类&#xff0c;一类是感应式读卡&#xff0c;卡片接触上去就读出数据。一种是触发式的&#xff0c;程序调用读卡方法&#xff0c;硬件再进入读卡轮询。对应触发式的只能加按钮触发了&a…

技术分享 | app自动化测试(Android)-- 特殊控件 Toast 识别

Toast 是 Android 系统中的一种消息框类型&#xff0c;它属于一种轻量级的消息提示&#xff0c;常常以小弹框的形式出现&#xff0c;一般出现 1 到 2 秒会自动消失&#xff0c;可以出现在屏幕上中下任意位置。它不同于 Dialog&#xff0c;它没有焦点。Toast 的设计思想是尽可能…

不要再纠结了!看完这篇,你就能秒懂webpack、vite、rollup三者间差异!

前端打包工具webpack、vite、rollup的区别及使用 webpack、vite、rollup的区别webpack、vite的区别为什么vite比webpack打包快&#xff1f;为什么有人会说vite慢&#xff1f;首屏问题懒加载问题解决方案注意点 webpackwebpack打包过程webpack打包原理第一次冷启动慢的原因热更新…

在yolov5源码中添加注意力机制

yolov5源码中添加注意力机制 1 项目环境配置1.1 yolov5 源码下载1.2 创建虚拟环境1.3 安装依赖 2 常用的注意力机制2.1 SE 注意力机制2.2 CBAM 注意力机制2.3 ECA 注意力机制2.4 CA 注意力机制 3 添加方式3.1 修改 common.py 文件3.2 修改 yolo.py 文件3.3 修改 yolov5s.yaml 文…

易查分如何导入数据?这个最关键的要点别忽略

我们在使用易查分制作查询系统时&#xff0c;偶尔会遇到Excel文件没有办法正常上传的情况。这个问题困扰着许多老师&#xff0c;他们不知道该如何解决。今天我想和大家讨论一下&#xff0c;易查分导入数据时最常出现错误的原因&#xff0c;其中这个要点最关键&#xff0c;但很多…

谷歌Bard入门指南

文章目录 谷歌Bard入门指南一、简介二、使用指南三、中文化3.1 中文提问3.2 中文回答 四、Hello Game五、亮点 谷歌Bard入门指南 一、简介 Bard 是一个大型语言模型&#xff0c;也称为对话式 AI 或聊天机器人&#xff0c;经过训练&#xff0c;内容丰富且全面。Bard 接受过大量…