目录
- 项目管理工具Maven
- 初识Maven
- 什么是Maven
- 为什么使用Maven
- Maven功能
- 什么是项目构建
- 什么是依赖管理
- Maven应用场景
- Maven项目结构
- Maven特点
- Maven模型
- Maven安装
- 安装准备
- Maven安装目录分析
- 环境变量配置
- 创建Maven项目
- 通过IDEA创建
- 手动创建
- 手动引入依赖
- 配置Maven仓库
- Maven仓库概念
- Maven仓库布局
- Maven本地仓库配置
- Maven远程仓库配置
- Maven项目视图
项目管理工具Maven
初识Maven
什么是Maven
Maven是跨平台的项目管理工具。主要服务基于Java平台的项目构建,依赖管理和项目信息管理。
它是 Apache 下的一个纯 Java 开发的开源项目,Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
为什么使用Maven
Java生态十分丰富,无论我们想实现什么功能,几乎都可以找到对应的工具类,而这些工具类都是以jar包的形式出现的。
这些jar包之间会有关联,在使用一个依赖之前还需要确定这个依赖所依赖的其他依赖。所以当我们的项目比价大的时候,这些依赖管理会变得十分臃肿,我们可以利用Maven解决这个问题。
同时它可以管理各种项目,如C#,Ruby等等
Maven可以处理多模块项目。对于简单的项目,我们单模块分包处理即可,但是如果项目比较复杂,要做成多模块项目,比如一个音乐盒,我们会有用户模块,服务端模块,图片模块等等,这些模块单独是无法运行的,我们需要将它们整合,我们借助Maven可以一键打包。
当我们使用Maven进行管理的时候,我们通过定义一个项目对象模型——POM来详细描述我们自己的项目配置,我们可以理解为Maven项目的配置文件。
Maven功能
Maven可以帮助我们开发者完成一下工作:
- 项目构建
- 文档生成
- 依赖管理
- 日志报告
- 发布
- 分发
- 等等其他功能
什么是项目构建
项目构建:是一个从编写源代码到编译、测试、运行、打包、部署的过程。
-
传统项目和maven项目构建的两种方式
-
传统项目:
打开Idea编写源代码和配置文件,对源代码进行编译,可以使用Junit进行单元测试,把项目打成war包,部署到Tomcat服务器中运行。
-
maven项目:
maven将项目构建过程进行标准化,每个阶段都可以使用一个命令来完成。
清理 --> 编译 --> 测试 --> 报告 --> 打包 --> 部署
好处:
可以通过命令完成项目构建。(测试:使用mvn tomcat:run的命令来发布运行项目)maven对每个构建阶段进行规范,有利于大型团队协作开发。
-
什么是依赖管理
对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。
对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。
Maven应用场景
Maven的应用场景,开发人员只要按着maven标准的目录结构进行开发即可,然后提交代码。在测试服务器上拉取Java源码,然后可以使用maven的自动化项目构建完成项目的清理、编译、测试、打包和安装部署等。
Maven项目结构
Maven项目提倡使用一个共同的标准目录结构,如下所示:
如下所示:
目录 | 目的 |
---|---|
${basedir} | 存放pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说property文件,springmvc.xml |
${basedir}/src/test/java | 项目的测试类,比如说Junit代码 |
${basedir}/src/test/resources | 测试用的资源 |
${basedir}/src/main/webapp/WEB-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 可以在Maven的settings.xml配置文件中自己更改自己的本地仓库 |
Maven特点
- 项目设置遵循统一的规则。
- 任意工程中共享。
- 依赖管理包括自动更新。
- 一个庞大且不断增长的库。
- 可扩展,能够轻松编写 Java 或脚本语言的插件。
- 只需很少或不需要额外配置即可即时访问新功能。
- 基于模型的构建 − Maven能够将任意数量的项目构建到预定义的输出类型中,如 JAR,WAR 或基于项目元数据的分发,而不需要在大多数情况下执行任何脚本。
- 项目信息的一致性站点 − 使用与构建过程相同的元数据,Maven 能够生成一个网站或PDF,包括您要添加的任何文档,并添加到关于项目开发状态的标准报告中。
- 发布管理和发布单独的输出 − Maven 将不需要额外的配置,就可以与源代码管理系统(如 Subversion 或 Git)集成,并可以基于某个标签管理项目的发布。它也可以将其发布到分发位置供其他项目使用。Maven 能够发布单独的输出,如 JAR,包含其他依赖和文档的归档,或者作为源代码发布。
- 向后兼容性 − 您可以很轻松的从旧版本 Maven 的多个模块移植到 Maven 3 中。
- 子项目使用父项目依赖时,正常情况子项目应该继承父项目依赖,无需使用版本号,并行构建 − 编译的速度能普遍提高20 - 50 %。
- 更好的错误报告 − Maven 改进了错误报告,它为您提供了 Maven wiki 页面的链接,您可以点击链接查看错误的完整描述。
Maven模型
Maven安装
安装准备
-
安装JDK1.8或以上
JDK下载地址:Java Downloads | Oracle 中国
进入下载页面之后我们去下面找我们需要的JDK版本:
-
安装Maven
Maven下载地址:Maven – Download Apache Maven
进去之后推荐的是Maven3.9,同样,你可以在下面找到你想要的Maven版本,这里我就不再安装,我直接使用idea2024自带的Maven插件,版本是Maven3.9.8,可以在idea的plugin目录中找到它的安装目录,我的目录是这样的:
D:\IDEA\IntelliJ IDEA 2024.2.3\plugins\maven\lib\maven3
解压的时候注意目录不要带中文
Maven安装目录分析
解压缩之后你应该可以在你的解压目录下看到这几个文件,我们来解释一下这些都存放了一些什么文件:
-
bin:含有mvn运行的脚本
-
boot:含有plexus-classworlds类加载器框架
-
conf:含有settings.xml配置文件
-
lib:含有Maven运行时所需要的java类库
-
LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍
环境变量配置
为什么要配置环境变量?
方便我们在任何地方都可以使用Maven,而不是每次都需要跳转到maven\bin目录下去操作这些可执行文件
同时简化了命令行操作;为不同的环境设置不同的配置;方便开发工具或应用程序通过环境变量获取配置信息等等,
-
设置MAVEN_HOME环境变量
这样配置我们在改变Maven版本的时候只需要重新设置MAVEN_HOME环境变量即可,无需修改Path中的系统环境变量
这里我们定位到Maven的解压目录即可
-
设置Path环境变量,把 %MAVEN_HOME%\bin 添加到Path的变量值末尾,与前面的内容用 ; 隔开,如图:
-
配置完成之后我们在控制台进行验证:
创建Maven项目
我们按照上面给出的Maven项目结构创建出我们的第一个Maven项目,
通过IDEA创建
我们先来看idea内置的Maven构建工具如何创建一个普通的Maven项目,这里我以IntelliJ IDEA 2024.2.3版本为例,如果你是其他版本的IDEA,可以去找对应版本的构建方式:
-
我们选择新建项目
-
我们创建普通Maven项目,直接选择Java,然后右边的构建系统选择Maven,不要选择下面Maven骨架生成器,会带一些不必要的格式:
这里的
groupId
、artifactId
指的是我们后面要说的Maven坐标,用于定位我们的Maven项目这里说一下groupId
一般是公司名字的反写,后面做详细解释 -
点击创建之后我们就创建好了我们的第一个Maven项目,但是在第一次创建的时候我们需要进行一些设置:
我们转到文件—>设置—>构建、执行、部署—>构建工具—>Maven,其中的Maven主路径选择你Maven解压的路径,下面的用户设置文件你也可以自己手动指定,本地仓库idea会自动读取settings.xml中指定的本地仓库,同样你也可以进行重写,指向你想要的仓库
-
设置完之后我们点击应用,这样我们该项目的Maven设置就配置好了,但是我们不想每次创建新Maven项目的时候都进行一次这样的设置,所以我们来到文件—>新建项目设置—>新项目的设置—>构建、执行、部署—>构建工具—>Maven,按照上面我们的设置再设置一遍就可以了
这就是我们创建好的Maven项目:
手动创建
为了深入了解Maven项目的具体结构,我们来根据项目结构手动创建一遍,一般不会手动创建:
-
src/main/java —— 存放项目的.java文件
-
src/main/resources —— 存放项目资源文件,如spring, mybatis配置文件
-
src/test/java —— 存放所有测试.java文件,如JUnit测试类
-
src/test/resources —— 测试资源文件
-
这里我的根目录是D:\JAVAProject\HelloMaven,这个可以自己选择
-
创建好以上文件夹之后,我们还不能将他称为Maven项目,我们需要在根目录添加pom.xml,也就是我们的Maven项目核心,并将下面这段代码复制进去(你可以先创建成txt文件,填入内容之后再修改后缀名为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.qcby</groupId> <!-- 如果你的项目名称和我不一样,这里也需要修改成你自己的项目名称 --> <artifactId>HelloMaven</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 这里用于引入依赖,JUnit用于测试类 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> </dependencies> </project>
-
创建
Hello.java
文件,在src/main/java/cn/tx/maven
目录下新建文件Hello.java
,这里/cn/tx/maven
这个路径你按你喜好自己设置,并将下面的代码放入其中:package cn.tx.maven; // 如果你路径改了,这里也需要修改,这里代表的是你此项目所在的包的位置 public class Hello { public String sayHello(String name){ return "Hello "+name+"!"; } }
-
创建
HelloTest.java
文件,在/src/test/java/cn/tx/maven
目录下新建测试文件HelloTest.java
,将下面的代码放入其中:package cn.tx.maven; // 你自己看着办 import org.junit.Test; import static junit.framework.Assert.*; public class HelloTest { @Test public void testHello(){ Hello hello = new Hello(); String results = hello.sayHello("maven"); assertEquals("Hello maven!",results); } }
-
到此为止我们的Maven项目算是手动创建成功了,我们可以在控制台对这个项目进行一些操作:
-
打开cmd命令行,进入Hello项目根目录执行 mvn compile命令,查看根目录变化
-
cmd 中继续录入mvn clean命令,然后再次查看根目录变化
-
cmd 中录入 mvn clean compile命令, 查看根目录变化
-
cmd 中录入 mvn clean test命令,查看根目录变化
-
cmd 中录入 mvn clean package命令,查看根目录变化
-
cmd 中录入 mvn clean install 查看仓库会把项目安装到仓库里
这些命令我们之后还会提到,这里先看看你的项目根目录变化就好,有一些变化会发生在新生成的target文件夹下
-
手动引入依赖
我们来手动完成一下Maven引入依赖的过程
-
首先按照上面的步骤我们再来新建一个Maven项目,我把他命名为:
HelloFriend
,但是这次我们在pom
文件中将我们的HelloMaven
项目作为依赖引入我们当前的HelloFriend
:<?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.qcby.maven</groupId> <artifactId>HelloFriend</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> <!-- 将之前的HelloMaven01当作依赖引入 --> <dependency> <groupId>com.qcby.maven</groupId> <artifactId>HelloMaven01</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies> </project>
-
创建
HelloFriend.java
文件,在src/main/java/cn/tx/maven
目录下新建文件HelloFriend.java
package cn.tx.maven; import cn.tx.maven.Hello; // 引入上面的Hello类 public class HelloFriend { public String sayHelloToFriend(String name){ Hello hello = new Hello(); String str = hello.sayHello(name)+" I am "+this.getMyName(); System.out.println(str); return str; } public String getMyName(){ return "John"; } }
-
创建
HelloFriendTest.java
文件,在/src/test/java/cn/tx/maven
目录下新建测试文件HelloFriendTest.java
package cn.tx.maven; import cn.tx.maven.Hello; public class HelloFriend { public String sayHelloToFriend(String name){ Hello hello = new Hello(); String str = hello.sayHello(name)+" I am "+this.getMyName(); System.out.println(str); return str; } public String getMyName(){ return "John"; } }
-
然后我们对
HelloFriend
项目进行测试打包,在HelloFriend
目录下执行命令mvn package
,如果你在之前的HelloMaven
项目中没有执行过mvn clean install
命令的话,那你就会得到这样一个结果:系统报错提示:Could not find artifact com.qcby.maven:HelloMaven:jar:1.0-SNAPSHOT也就是没办法找到我们想要的依赖
HelloMaven.jar
故此我们需要重新构建第一个项目
HelloMaven
并安装到仓库,在命令行HelloMaven
根目录下执行mvn clean install
:此时再次对HelloFriend进行打包:
可以发现成功了
配置Maven仓库
Maven仓库概念
用来统一存储所有Maven共享构建的位置就是仓库,Maven有三种仓库类型:
Maven有3种仓库类型:本地仓库、私服仓库、中央仓库
仓库类型 | 说明 |
---|---|
本地仓库 | 就是你自己电脑上的仓库,每个人电脑上都有一个仓库 默认位置在当前用户名.m2\repository 你也可以在配置文件中定义自己的仓库路径 |
私服仓库 | 一般来说是公司内部搭建的Maven私服,处于局域网中,访问速度较快 这个仓库中存放的jar 一般就是公司内部自己开发的jar |
中央仓库 | 由Apache 团队来维护,包含了大部分的jar 早期不包含Oracle 数据库驱动,从 2019 年8月开始,包含了Oracle驱动 |
现在存在3个仓库,那么jar包如何查找呢?
大概是这样一个顺序
Maven仓库布局
- 根据Maven坐标定义每个构建在仓库中唯一存储路径
- groupId/artifactId/version/artifactId-version/packaging
这些坐标可以帮我们定位一个仓库中的jar包的位置
Maven本地仓库配置
我们通过修改Maven配置文件settings.xml中的本地仓库路径,定义自己的本地仓库
Maven远程仓库配置
如果不配置镜像源的话,Maven会自动从中央仓库下载我们的依赖,可能会导致下载慢或者链接不上的情况,我们可以配置镜像源,来替代中央仓库:在mirrors标签中添加:
<!-- 阿里镜像 -->
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>aliyun Maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
就可以替代中央仓库,使用阿里镜像源来下载依赖,提高下载速度,当然你可以选择其他的镜像源。