01.Maven
# 01.Maven
# 1、Maven简介
提供了一套标准化的项目结构
提供了一套标准化的构建流程(编译,测试,打包,发布……)
提供了一套依赖管理机制
构建管理
- Maven可以用于构建和管理项目,如Java、C#等
- Maven使用一个标准方式来构建项目,包括编译源代码、运行测试、打包二进制文件、生成文档等
依赖管理
- Maven有一个中央仓库,用于管理JAR文件、依赖和文档
- Maven项目的POM文件描述了项目的依赖关系,Maven会自动下载所有依赖文件并将它们放在正确的位置
项目信息管理
- Maven可以管理项目的信息,如开发者、版本、邮件列表、依赖关系、变更日志等。这些信息可以在POM文件中进行管理
构建过程管理
- Maven使用标准的或者自定义的插件参与构建的各个阶段,能够进行项目信息报告、依赖关系分析、单元测试报告等
# 2、项目结构
- 一个使用Maven管理的普通的Java项目,它的目录结构默认如下
- 所有的目录结构都是约定好的标准结构,我们千万不要随意修改目录结构
- 使用标准结构不需要做任何配置,Maven就可以正常使用
a-maven-project // 项目名
├── pom.xml // 项目描述文件
├── src
│ ├── main
│ │ ├── java // 存放Java源码的目录
│ │ └── resources // 存放资源文件的目录
│ └── test
│ ├── java // 存放测试源码的目录
│ └── resources // 存放测试资源的目录
└── target // 所有编译、打包生成的文件都放在target目录里
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 3、pom.xml
一个Maven工程就是由
groupId
,artifactId
和version
作为唯一标识groupId
类似于Java的包名,通常是公司或组织名称artifactId
类似于Java的类名,通常是项目名称再加上
version
我们在引用其他第三方库的时候,也是通过这3个变量确定
使用
<dependency>
声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.itranswarp.learnjava</groupId>
<artifactId>hello</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
...
</properties>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 4、Maven安装
- Mac安装
brew install maven
mvn -version
1
2
2
# 5、更换远程仓库
- 在xml文件中,我们要关注两个地方,我在下面列了出来
localRepository
和mirrors
- 第一个localRepository是你本地仓库所在的位置,你的包都会下载到这里
- 默认在你用户目录的.m2目录下,挺直观的,就没修改了
第二个mirror是你的包下载地址
- 因为有墙,所以建议增加阿里云仓库配置,来加速下载
- 具体配置如下,可以自己在xml中寻找,然后使用下面文件替换即可
# vi /usr/local/Cellar/maven/3.9.7/libexec/conf/settings.xml
1
<mirrors>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 02.依赖管理
compile :编译
clean:清理
test:测试
package:打包
install:安装
- 如果我们的项目依赖第三方的jar包,我们需要手动下载zip包,解压到classpath路径下
- Maven解决了依赖管理问题
- 例如,我们的项目依赖
abc
这个jar包,而abc
又依赖xyz
这个jar包 - 当我们声明了
abc
的依赖时,Maven自动把abc
和xyz
都加入了我们的项目依赖
- 例如,我们的项目依赖
# 1、初始化项目
- 首先,我们使用Maven的
archetype:generate
命令初始化一个项目
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
1
- 这个命令会创建一个名为my-app的项目,项目的目录结构如下
my-app // 项目名
├── pom.xml // 项目描述文件
└── src
├── main
│ └── java // 存放Java源码的目录
│ └── com
│ └── example
│ └── App.java
└── test
└── java // 存放测试源码的目录
└── com
└── example
└── AppTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 2、IDEA打开
- IntelliJ IDEA会自动加载项目,并解析pom.xml文件,下载项目所需的依赖
- 如果你的项目使用的Java版本和IDEA默认的Java版本不一致,你可能需要手动设置项目的SDK
- 点击"File",然后选择"Project Structure",在弹出的窗口中选择"Project",然后在右侧的"Project SDK"下拉菜单中选择合适的Java版本
- 还可以在"File" -> "Settings" -> "Build, Execution, Deployment" -> "Build Tools" -> "Maven"中配置Maven的相关设置
- 如Maven home directory(Maven的安装路径
- User settings file(用户配置文件的路径,通常是~/.m2/settings.xml)
- Local repository(本地仓库的路径,通常是~/.m2/repository)
# 3、添加依赖
- 我们需要在
pom.xml
文件中添加依赖项- junit:用来做单元测试
- jackson-databind:用来做Json序列化
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 4、下载依赖
- Maven会自动下载项目所需的所有依赖
- 在项目上右键,然后选择"
Maven -> Reload project
"
mvn clean install
1
# 5、使用依赖
src/test/java/com/example/AppTest.java
import org.junit.Test;
import static org.junit.Assert.*;
public class AppTest {
@Test
public void testApp() {
assertTrue(true);
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
src/main/java/com/example/Main.java
package com.example;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
// 使用mapper对象进行JSON序列化或反序列化
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 6、运行测试
- Maven会自动运行项目中的所有测试,包括我们刚才添加的测试
mvn test
1
# 03.IDEA使用maven
# 1、IDEA创建Maven项目
# 2、IDEA配置Maven
- 在idea等工具中配置路径时:在打开的路径弹窗中,直接按快捷键command+shift+G,输入需要的路径
# mvn -version
Maven home: /usr/local/Cellar/maven/3.9.7/libexec
/usr/local/Cellar/maven/3.9.7/libexec/conf/settings.xml
1
2
3
4
2
3
4
- 配置Maven自动更新
- 让上面maven配置新建项目时生效(然后重复上面步骤即可)
# 3、IDEA配置Maven-Helper
- 快速解决依赖冲突了
# 4、依赖管理
- 添加依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
1
2
3
4
5
2
3
4
5
src/main/java/com/example/Main.java
package com.example;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
// 使用mapper对象进行JSON序列化或反序列化
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 04.依赖传递
- scope是一个元素,它用来限制依赖的传递性,同时也影响了依赖的classpath
compile:
- 这是默认的scope,如果没有指定一个scope,那么就会被设置为compile
- 这意味着该依赖项在所有的classpath中都可用,并且它们都会被打包
provided:
- 这意味着你需要在JDK或者容器中提供这个依赖
- 例如,当开发一个web应用的时候,Servlet API是由web容器提供的,所以你不需要在你的应用中包含Servlet API
- 在编译和测试的时候,这个classpath会被提供出来,但是在运行的时候,就不会了
runtime:
- 这个scope表示在编译主代码时,不需要这个依赖,但是在运行和测试代码的时候,需要这个依赖
test:
- 这个scope表示这个依赖只有在测试的时候才需要,它不会被打包进产品中。
system:
- 这个scope和provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径
- 这个scope通常是不推荐使用的,因为它会使得构建的可移植性变得很差
import:
- 这个scope只用在dependencyManagement中,表示从指定的POM中导入dependency配置
- 该依赖项在实际使用中的scope会被从这个POM中导入的依赖的scope覆盖
tomcat-servlet-api
的scope为provided
,这意味着它将在编译和测试时可用
- 但在运行时,它应该
由Tomcat容器提供
,因此不会被打包到最终的构建中
<dependencies>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>9.0.22</version>
<scope>provided</scope>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
上次更新: 2024/5/31 11:18:42