依赖管理
依赖管理解决的问题
我们学完一个语言的语法之后,我们应该都能知道函数的引用或者类的创建等了。为了方便管理,我们就会把一些特定的功能实现写在一个代码文件中,我们只需要使用的时候导入就行了,这样无论是修改还是阅读都更加的方便简洁,但这样会出来一个问题,一旦我们多个文件你引用我,我引用你,就会出现蜈蚣一般的嵌套(比如A引用B,B引用C),这样我们迁移或者打包的整个项目的时候就会很复杂,整个引用宛如迷宫一般,人工来管理就会很麻烦。这个时候Maven就能解决这个问题
Maven的作用
当我们声明了A的依赖的时候,Maven会自己判断这个模块和其他被引用的模块是否还有其他的依赖,如果有,就会自动导入其他的依赖,不用我们去判断是否有其他的依赖了。那我们怎么声明呢,就是在pom.xml
这文件里面
pom.xml
pom.xml
这个文件很有用,是项目的maven的配置文件,我们来仔细看看这个文件
xml
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>hello</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.16</version>
</dependency>
</dependencies>
</project>
我们来梳理一下整文件的结构:
我们可以分为几个大块
<project ...>
- 是
pom.xml
的根元素,包含了所有项目的配置信息。 - 定义了命名空间和模式,确保文件遵循 Maven POM 规范。
xml
<project ...>
所有项目的配置信息。
</project>
整个项目自己的信息
xml
<modelVersion>4.0.0</modelVersion>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>hello</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
这些都是你管理项目的信息
一个Maven工程就是由groupId
,artifactId
和version
作为唯一标识。
<modelVersion>
- 定义 POM 文件的模型版本,目前通常为
4.0.0
。
<groupId>
- 表示项目的组 ID,通常是项目所属组织的反向域名(如
com.example
)。 - 必须唯一,通常用来标识公司或组织。
<artifactId>
- 项目的唯一标识符,表示模块或项目的名称(如
my-app
)。 artifactId
应该在同一groupId
下是唯一的。
<version>
- 定义项目的版本号(如
1.0.0
)。 - 如果是开发版本,可以使用
-SNAPSHOT
标识(如1.0.0-SNAPSHOT
),表示不稳定版本。
<packaging>
- 指定项目的打包方式,默认为
jar
。 - 其他常见值有
war
(Web 应用)、pom
(父项目)等。
<properties..>
这个标签里面是统一管理版本号、编码等配置。
project.build.sourceEncoding
:表示项目源码的字符编码,通常应设定为UTF-8
;maven.compiler.release
:表示使用的JDK版本,例如21
;maven.compiler.source
:表示Java编译器读取的源码版本;maven.compiler.target
:表示Java编译器编译的Class版本。
xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
</properties>
值得注意的是
从Java 9开始,推荐使用maven.compiler.release
属性,保证编译时输入的源码和编译输出版本一致。如果源码和输出版本不同,则应该分别设置maven.compiler.source
和maven.compiler.target
。
通过<properties>
定义的属性,就可以固定JDK版本,防止同一个项目的不同的开发者各自使用不同版本的JDK。
<dependencies..>
这里面就是整个项目所需的依赖
-
定义项目的依赖项,每个依赖项用
<dependency>
标签表示。xml<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>2.0.16</version> </dependency> </dependencies>
-
关键字元素:
<groupId>
:依赖的组 ID。<artifactId>
:依赖的 artifact ID。<version>
:依赖的版本号。
我们在引用其他第三方库的时候,只需要通过这3个变量确定。例如,依赖org.slfj4:slf4j-simple:2.0.16
:这个依赖是我们可以直接在线下载下来直接调用的,解析下来就是
groupId
为 org.slfj4
artifactId
为slf4j-simple
version
为 2.0.16
一般我们在表示Maven依赖时,使用简写形式groupId:artifactId:version
这个时候回去看pom.xml
我们就发现整个结构已经非常清晰了,就是各种配置的结合体
xml
既然提到了,那我们就顺便介绍一遍xml这个格式吧,通过上面的例子我们能看出xml是非常像html的语法的,但是xml有着很高的自由度,因为xml的本意就是靠着这样的层级信息去表达主题各式各样的信息
这样的表示优点就是非常的结构化,结构化对于整个计算机的信息表示无疑是非常契合和高效的
xml的表示既非常地公式化,使用<>
来将这个盒子命名就行,里面随便输入信息就行,因为xml的功能就像文章一样,只是用来看的。也非常的灵活,每个<>
都可以进行嵌套