使用 Maven 构建的项目

news/2025/3/27 5:09:50/文章来源:https://www.cnblogs.com/chenghd/p/18703520

Maven 构建应用

对于各位 Java 开发者来说 Maven 这个工具都不陌生,本文旨在整理一下 Maven 中一些常用知识点和使用技巧。

版本说明:
Maven:3.8.1
Idea:2022.1.4

Maven 构建单模块应用

文件目录

普通的Maven构建的Java项目,它的基本目录结构如下:

maven-project
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   └── resources
│   └── test
│       ├── java
│       └── resources
└── target
  • maven-project:是项目的根目录名;
  • pom.xml:maven 项目的配置文件,定义项目依赖、插件、版本等信息(这个文件比较重要,后面会进一步介绍);
  • src/main/java:此目录存放项目源代码(java项目中这个目录名就是java,如果是kotlin项目或者其他项目就不一样了);
  • src/main/resources:此目录存放非代码资源文件,如:一些配置文件(xxx.yml),资源文件(html、js、图片)等;
  • src/test/java:放测试代码;
  • src/test/resources:放测试用的资源文件;
  • target:这是 maven 自动生成的编译、测试、打包输出目录;

pom.xml 文件

pom.xml 文件是 maven 项目的核心,他几乎包含了一个 maven 项目的所有信息。

我们通过一个简单的模板来看一下:

<?xml version="1.0" encoding="UTF-8"?><!-- 这里的 xmlns xmlns xsi:schemaLocation 不用太关心,正常情况下工作中用不到(一般都是别人配置好的),感兴趣的可以搜一下 -->
<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"><!-- 这个一般都是 4.0.0 ,指定了 POM 文件的格式版本 --><modelVersion>4.0.0</modelVersion><!-- 组织id,类似于Java的包名,通常是公司或组织名称或者域名倒写。 --><groupId>com.chenghd</groupId><!-- 类似于Java的类名,通常是项目名称。 --><artifactId>maven-project</artifactId><!-- 版本,这个版本的写法有很多规范,不同的公司有不同的要求。 --><version>1.0</version><!-- packaging 的作用有几个: --><!-- 1、指定项目最终生成的文件类型,如 jar、war、ear、pom 等(默认是jar)。--><!-- 2、maven 根据配置不同的 packaging 值调用不同的插件来构建项目--><!-- 3、在多模块中项目,父模块通常设置成 pom,这种类型项目不会产生任何实际的可执行代码或库,而是用来定义一组共享的配置、依赖关系和插件设置。它的子模块会继承这些配置。--><packaging>jar</packaging><properties><!-- 这个用来显式指定项目中源文件(如 .java、.kt、.properties 等)的字符编码格式。 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 指定源代码的语法版本和目标字节码的版本,需要 maven-compiler-plugin 版本高一点,支持这个标签 --><maven.compiler.release>17</maven.compiler.release><!-- 在jdk8之后的版本可用上面的替换下面这两个 --><!--<maven.compiler.source>8</maven.compiler.source>--><!--<maven.compiler.target>8</maven.compiler.target>--></properties><!-- 依赖的其他项目 --><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.16</version></dependency></dependencies>
</project>

在 maven 中,是靠 groupId、artifactId 和 version 这三个属性来确定项目的唯一性的(其实这个三个属性看字面意思就知道作用是什么了)。

pom.xml 依赖

在 pom.xml 中比较常用的就是处理项目的依赖问题。比如,我们写 dao 层的时候需要用到 mybatis、mysql-jdbc 等项目中的代码,这时候就可以把这些项目以配置文件的方式加到 pom.xml 文件中,这样 maven 就会帮我们自动下载相关源码,并导入到我们的项目中。

看一个简单的依赖配置例子:

<project ...>...<dependencies><!-- 这里依赖(引用)了一个项目 --><dependency><!-- 组织 id,类似公司名 --><groupId>org.junit.jupiter</groupId><!-- 项目名,类似部门名 --><artifactId>junit-jupiter-api</artifactId><!-- 版本 --><version>5.3.2</version><!-- 依赖范围,很多情况下,我们会省略这个配置,默认是 compile --><scope>test</scope></dependency></dependencies>
...</project>

scope 定义了包的依赖的范围,也就是什么时候会用到这个jar包的内容,这个配置的值有:compile、test、runtime 和 provided 这几种。

scope 说明
compile 编译时需要用到该jar包(默认)。
test 编译 Test 时需要用到该jar包(也就是在 test 文件夹下用到的),这个依赖最终不会被打包到项目中,scope 为 test 也无法传递依赖。
runtime 编译时不需要,但运行时需要用到。如JDBC驱动等。
provided 编译时需要用到,但运行时由JDK或某个服务器提供。如Servlet API等。

mvnw

一般工作中我们用 idea 之类的开发工具构建的 maven 项目会多出来几个文件,如下:

maven-project
├── ...
├── .mvn
│   ├── wrapper
│   │   └── maven-wrapper.properties
├── mvnw
└── mvnw.cmd

PS:当然还有一些 .idea、.iml、.gitignore 这些和 mavan 项目不是直接相关的文件就不做介绍了。

  • mvnw:全名是 maven wrapper ,他会根据 maven-wrapper.properties 文件中的配置自动下载项目所需的 Maven 版本。这样就确保了所有开发人员都会用同一个 maven 版本开发项目。他其实就用用来替代 mvn 命令的(后面会讲)。
  • mvnw:mvnw文件适用于Linux(bash),mvnw.cmd适用于Windows 环境。
  • maven-wrapper.properties:记录了项目所需的 Maven 版本等信息。

mvn

在实际开发过程中,虽然用开发工具点点点就可以,但是稍微了解下常用的 mvn 命令也是有必要的。

经常使用的命令有:

# 清理所有生成的class和jar;
mvn clean# 先清理,再执行到compile;
mvn clean compile# 先清理,再执行到test,因为执行test前必须执行 compile,所以这里不必指定compile;
mvn clean test# 先清理,再执行到package。
mvn clean package

Maven 构建多模块应用

很多时候我们的项目都是多模块的,这样可以在不同的模块中写不同的逻辑,分工更明确点。我们下面用一个 springboot 的项目来做演示。

文件目录

它的基本目录结构如下,在一个 maven-multi-project 项目中有三个模块 module-a、module-b、module-c:

maven-multi-project
├── pom.xml
├── module-a
│   ├── pom.xml
│   └── src
├── module-b
│   ├── pom.xml
│   └── src
└── module-c├── pom.xml└── src

pom.xml 文件

我们简单看一下多模块可以怎么配置来统一管理版本:

maven-multi-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"><modelVersion>4.0.0</modelVersion><groupId>com.chenghd</groupId><artifactId>maven-multi-project</artifactId><!-- 这里是 pom 哈,上面讲过了 --><packaging>pom</packaging><version>${revision}</version><modules><module>module-a</module><module>module-b</module><module>module-c</module></modules><properties><!-- 整个项目版本,这里对多个模块做统一管理,保证所有模块中互相依赖不会出问题 --><revision>0.1.0</revision><!-- 源代码版本和编译目标的字节码版本 --><!-- 可以用 <maven.compiler.release>17</maven.compiler.release> 代替--><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><!-- 其他依赖包版本统一管理  --><!-- 要求所有子模块要是用到 springboot 都使用同一个版本,避免版本冲突等问题 --><version.springboot>3.1.12</version.springboot><version.spring>6.0.21</version.spring></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>compile</scope></dependency></dependencies><!-- 配置阿里镜像,可以加快下载 jar 包速度,当然你也可以在 settings.xml 文件里全局配置,那样就不用每个项目都配置了 --><repositories><repository><id>aliyun</id><name>aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><layout>default</layout><releases><enabled>true</enabled><updatePolicy>never</updatePolicy></releases><snapshots><enabled>true</enabled><updatePolicy>never</updatePolicy></snapshots></repository></repositories></project>

maven-multi-project/module-a/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"><modelVersion>4.0.0</modelVersion><artifactId>module-a</artifactId><parent><artifactId>maven-multi-project</artifactId><groupId>com.chenghd</groupId><!--在 maven-multi-project/pom.xml 的 properties 中配置的 --><version>${revision}</version></parent><dependencies><!-- 依赖 spring 相关内容 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><!--在 maven-multi-project/pom.xml 的 properties 中配置的 --><version>${version.spring}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><!--在 maven-multi-project/pom.xml 的 properties 中配置的 --><version>${version.spring}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><!--在 maven-multi-project/pom.xml 的 properties 中配置的 --><version>${version.spring}</version></dependency></dependencies></project>

maven-multi-project/module-b/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"><modelVersion>4.0.0</modelVersion><artifactId>module-b</artifactId><parent><artifactId>maven-multi-project</artifactId><groupId>com.chenghd</groupId><!--在 maven-multi-project/pom.xml 的 properties 中配置的 --><version>${revision}</version></parent><dependencies><!-- 依赖的 springboot 的相关内容--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${version.springboot}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>${version.springboot}</version><scope>test</scope></dependency></dependencies><build><!-- 格式化最后打包的jar包名 --><!-- 这里打包会生成:maven-module-b-0.1.0.jar --><finalName>maven-${artifactId}-${revision}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><!-- springboot项目启动入口类位置 --><mainClass>com.chenghd.Application</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>
</project>

module-c 也差不多,省略了。

参考

Maven介绍,廖雪峰的官方网站。
Maven官网,Maven的官方网站。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用PyCharm连接服务器并配置Python虚拟环境

使用PyCharm连接服务器并配置Python虚拟环境 以StrongSORT作为例子,用PyCharm打开StrongSORT项目1.打开idea设置,找到SSH配置2.添加配置并测试连接3.新建一个刚刚添加的服务器的终端4.新建一个StrongSORT项目文件夹 mkdir StrongSORT5.按照README文档创建虚拟环境 conda crea…

sd9

1、Knowledge Distillation in Iterative Generative Models for Improved Sampling Speed 提高采样速度2种方法:schedular优化、蒸馏 本论文基于DDIM,DDPM训练出来的epsilon theta 可以直接用于DDIM。由于DDIM的降噪过程是确定的,但是step多,由此定义了一个确定的教师分…

【昆工 25 考研调剂捡漏!计算机调剂名额近80+】

📣【昆工 25 考研调剂捡漏!计算机调剂名额近80+】📣 3月25日唐师兄更新 🔥计算机考生看过来!昆明理工大学信息工程与自动化学院调剂通道开启!名额多、方向全、全日制/非全均有岗,速进群锁定上岸席位! 🌟 重点调剂方向 🌟 ✅ 计算机应用技术(16人) ✅ 人工智能…

76. 最小覆盖子串(滑动窗口)

O(1)的字符频度匹配 设计一个 distance数组记录 s字串和 t的匹配程度。也就是每个字符频度的差 s[c] - t[c] = distance[c] t初始化distance中个字符的频度,如果s[c] 统计到一个,就在distance--,这样,当distance为0时,就代表这个字符完全匹配。 此外再创建一个count记录有…

在HTML页面通过JavaScript访问Ollama本地部署的DeepSeek

在HTML页面通过JavaScript访问Ollama本地部署的DeepSeek,顺便解决了 HTML 页面调用 Ollama 服务的跨域问题前排提醒: 1. 操作系统为Windows11 2. 如果你还没有使用Ollama本地部署DeepSeek,可以参考Windows系统上使用Ollama本地部署DeepSeek 3. 顺便解决了 HTML 页面调用 Oll…

【3】进制转换学习总结(c++)

1.进制的基础知识 一:进制是进位计数制,是人为定义的带进位的计数方法。对于任何一种进制,例如:X进制,就表示每一位置上的数运算时都是逢X进一位。比如十进制就是逢十进一,二进制就是逢二进一。 二:生活中常见的进制有:十进制,十二进制,二十四进制,六十进制等。 2.十…

vue+leaflet示例:地图截图批量导出(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

智能Agent如何改造传统工作流:从搜索到全能助手

智能Agent如何改造传统工作流:从搜索到全能助手 引言:当AI遇上工作流 还记得我们以前搜索信息的方式吗?输入关键词,浏览大量结果,筛选有用内容,再整合成我们需要的答案。这个过程不仅耗时,还常常让人感到疲惫。 如今,智能Agent的出现正在彻底改变这一切。想象一下,你只…

vue+leaflet示例:拓展wms以及wmts地图范围裁剪(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

vue+leaflet示例:快速渲染聚合矢量瓦片(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

vue+leaflet示例:热力图(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…

vue+leaflet示例:地图全图以及框选截图导出功能(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动demo命令:npm run dev (3)打包demo命令: n…