目录
- 一、Maven简介
- 1.背景
- 2.Maven是什么
- 3.Maven的作用
- 二、下载与安装
- 1.下载
- 2.安装
- 3.配置环境变量
- 三、Maven基础概念
- 1.仓库
- 2.坐标
- 3.本地仓库配置
- 4.远程仓库配置
- 5.阿里云-镜像仓库配置
- 6.全局 settings 与用户 settings 区别
- 四、第一个Maven项目(手工制作)
- 1.Maven项目结构
- 2.Maven项目构建
- 构建过程1:compile
- 构建过程2:clean
- 构建过程3:test
- 构建过程4:package
- 构建过程5:install
- 3.插件创建工程
- 五、第一个Maven项目(IDEA生成)
- 1.创建 Maven 项目-jar
- 2.创建 Maven 项目-war
- 2.定制 Maven 脚本
- 3.插件
- 六、依赖管理
- 1.依赖配置
- 2.依赖传递
- 3.依赖传递冲突问题
- 4.可选依赖
- 5.排除依赖
- 6.依赖范围
- 7.依赖范围传递性
- 七、生命周期与插件
- 1.构建生命周期
- 2.插件
- 3.打包源码插件
一、Maven简介
1.背景
传统项目管理状态分析:
- jar包不统一,jar包不兼容;
- 工程升级维护过程操作繁琐。
- ……
2.Maven是什么
Maven
是 java 语言编写的一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。POM
(Project Object Model):项目对象模型。
3.Maven的作用
- 项目构建:提供标准的、跨平台的自动化项目构建方式。
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题。
- 统一开发结构:提供标准的、统一的项目结构。
Maven出现前,项目结构杂乱:
Maven出现后,创建了统一的项目结构:
二、下载与安装
- 官网: http://maven.apache.org/
- 下载地址: http://maven.apache.org/download.cgi
1.下载
下载页面可以看到目前最新的版本号,以及最后发布时间:
在下面可以看到 Linux、Windows 的安装包,以及相应的源码包:
2.安装
解压压缩包后,目录内容如下:
我们用笔记本打开 bin 目录下的 mvn.cmd:
可以看到 Maven 是需要 JAVA_HOME 和 MAVEN_HOME 两个环境变量支持的:
3.配置环境变量
我们需要提前创建好这两个环境变量,在我的电脑,点击属性 -> 高级系统设置 -> 环境变量 -> 新建,输入好我们的安装目录即可。
还需要将 maven 的执行命令放到 Path 里面,方便我们后期使用。
输入如下命令,测试环境变量配置结果:
mvn -v
正确配置后结果:
三、Maven基础概念
1.仓库
- 仓库:用于存储资源,包括各种 jar 包
- 仓库分类:
- 本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源。
- 远程仓库:非本机电脑上的仓库,为本地仓库提供资源。
- 中央仓库:Maven 团队维护,存储所有资源的仓库。
- 私服:部门/公司范围内存储资源的仓库,从中央仓库获取资源。
- 私服的作用:
- 保护具有版权的资源,包括购买或自主研发的 jar 包。
- 中央仓库中的 jar 都是开源的,不能存储具有版权的资源。
- 一定范围内的共享资源,仅对内部开放,不对外共享。
- 保护具有版权的资源,包括购买或自主研发的 jar 包。
2.坐标
-
什么是坐标?
Maven 中的坐标用于描述仓库中资源的位置。
https://repo1.maven.org/maven2/
-
Maven 坐标主要组成:
- groupId: 定义当前 Maven 项目隶属组织名称(通常是域名反写,例如:org.mybatis);
- artifactId: 定义当前 Maven 项目名称(通常是模块名称,例如 CRM、SMS);
- version: 定义当前项目版本号。
- packaging: 定义该项目的打包方式,取值一般有如下三种:
- jar:该资源打成 jar 包,默认是 jar,用于打包 java 工程;
- war:该资源打成 war 包,用于打包 web 工程;
- pom:该资源是一个父资源(表明使用maven分模块管理),打包时只生成一个 pom.xml 不生成 jar 或其他包结构。
Maven 仓库网站: https://mvnrepository.com/
-
Maven 坐标的作用
使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的标识与下载工作交由机器完成。
例如:我想找 junit 4.12 的包
我们一般找 Maven 的相关依赖,都是去 Maven 的仓库页面上找:https://mvnrepository.com/
3.本地仓库配置
-
Maven 启动后,会自动保存下载的资源到本地仓库。
-
默认位置
<localReporsitory>${user.home}/.m2/repository</localReporsitory>
默认仓库目录为登陆用户名所在目录下的
.m2
文件夹中。 -
自定义位置
<localRepository>D:\maven_repository</localRepository>
设置仓库目录为 D:\maven_repository 文件夹中。
-
我们先执行一下如下命令,Maven 会自动帮我们创建一个本地仓库:
mvn
创建的本地仓库地址默认是在:C:\Users\用户名\.m2\repository
但是如果我们使用默认地址,这个文件夹会越来越大,把 C 盘撑爆,所以我们需要自定义仓库路径。可以在 Maven 安装路径的 conf 文件夹下的 settings.xml 中进行配置:
4.远程仓库配置
-
远程仓库其实就是指定 Maven 的 jar 包是从哪来的,其实默认在 Maven 中已经做了设置了。
-
Maven 默认连接的仓库位置:
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
具体是在哪里进行了远程仓库的配置?
先说结论:默认远程仓库是在maven-model-builde-3.9.1.jar(不同版本可能会有区别)的org/apache/maven/model路径下的pom-4.0.0.xml中指定的。
下面说一下具体是怎么找到的:
首先,我们打开 Maven 安装目录下的 lib
文件夹,使用 WinRAR
打开任意一个 jar 包后,在 WinRAR 中返回到上一级 lib 目录下,点击搜索,输入 pom*.* 进行搜索:
WinRAR下载地址: https://www.win-rar.com/start.html?L=7
在搜索结果中,我们可以看到有一个 pom-4.0.0.xml 的文件:
点击定位,就可以定位到文件的具体位置了,我们关闭搜索框,然后将文件拖拽到刚才的 lib 目录下:
打开后,我们可以看到这里配置了远程仓库的地址:
我们可以看到 url 是 https://repo.maven.apache.org/maven2,这个是国外的服务器,我们都知道国外的服务器下载东西比较慢,所以我们就需要修改默认的配置,使用国内的服务器帮我们下载。
阿里就做好了这样的一个仓库,注意这里不是修改中央仓库的位置,而是当我们访问中央仓库的时候,不再访问国外的服务器,而是访问阿里的服务器,这样速度就比较快了,国外的中央仓库依然存在。那么我们管这样的仓库,叫做镜像仓库
。
5.阿里云-镜像仓库配置
-
在 settings.xml 文件中配置阿里云镜像仓库:
<mirrors> <!-- 配置具体的仓库的下载镜像 --> <mirror> <!-- 此镜像的唯一标识符,用来区分不同的 mirror 元素 --> <id>nexus-aliyun</id> <!-- 对哪种仓库进行镜像,简单说就是替代哪个仓库 --> <mirrorOf>central</mirrorOf> <!-- 镜像名称 --> <name>Nexus aliyun</name> <!-- 镜像URL --> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
我们打开 settings.xml 文件,找到 <mirrors>
标签,将上面的阿里云仓库配置粘贴到里面:
到这儿我们就完成了镜像仓库的配置。
补充:
- 国内建议使用阿里云的镜像(可以百度搜
阿里云maven
,也可以打开下方链接) - 阿里云仓库链接:https://developer.aliyun.com/mvn/guide
6.全局 settings 与用户 settings 区别
- 全局 settings 定义了当前计算机中 Maven 的共同配置。
- 用户 settings 定义了当前用户的配置。
这里仅作了解,我们可以在仓库中再配置一个 settings.xml 文件,注意这里的 settings.xml 文件最好与 conf 中的 settings.xml 文件保持一致,不然关于不一致的内容,仓库中的 settings.xml 内容会覆盖 conf 中的 settings.xml 内容。
四、第一个Maven项目(手工制作)
1.Maven项目结构
先创建一个文件夹 java-project,再根据Maven项目结构依次创建相应层级的文件夹
在 java-project/src/main/java/com/demo 目录下,创建 Demo.java 文件,并写入如下内容:
package com.demo;
public class Demo {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
在 java-project/src/test/java/com/demo 目录下,创建 DemoTest.java 文件,并写入如下内容:
package com.demo;
import org.junit.Test;
import org.junit.Assert;
public class DemoTest {
@Test
public void testDemo() {
Assert.assertEquals("Hello World!", "Hello World!");
}
}
在 java-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">
<!--指定pom的模型版本-->
<modelVersion>4.0.0</modelVersion>
<!--打包方式 web工程打包为war java工程打包为jar-->
<packaging>jar</packaging>
<!--组织id-->
<groupId>com.demo</groupId>
<!--项目id-->
<artifactId>java-project</artifactId>
<!--组织id release代表完成版,SNAPSHOT代表开发版-->
<version>1.0-SNAPSHOT</version>
<!-- 指定 JDK 版本和编码格式 -->
<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>
<!--具体的依赖-->
<dependency>
<!--依赖的组织id-->
<groupId>junit</groupId>
<!--依赖的项目id-->
<artifactId>junit</artifactId>
<!--依赖的版本-->
<version>4.12</version>
</dependency>
</dependencies>
</project>
创建完成后的Maven项目结构如下:
2.Maven项目构建
构建过程1:compile
在 pom.xml 文件所在目录中,打开控制台窗口,执行如下命令进行编译:
mvn compile
执行结果如下,我们可以看到编译过程中是先去我们指定的阿里云仓库去下载依赖:
如果是之前已经下载过依赖,再执行就会是这样:
我们可以看到这里使用了两个插件:maven-resources-plugin
、maven-compiler-pugin
。
插件的存放位置可以去maven仓库中找到:
下载编译之后,我们可以在编译日志中看到编译了1个文件到 target\classes
目录中:
命令执行完之后,我们可以看到项目中多了 target 文件夹。
目前 target 文件夹中包含两个文件夹:
构建过程2:clean
我们可以执行如下命令,来清理编译后的内容:
mvn clean
执行结果如下:
我们可以看到,这里也是使用了一个 Maven 插件:maven-clean-plugin
,然后执行的操作就是将 target 文件夹删除了。
构建过程3:test
我们可以执行如下命令,对项目进行测试:
mvn test
执行结果如下:
执行日志中,我们可以看到执行了 1 个测试,失败了 0 个。
执行之后,我们发现又创建了 target 文件夹,但是文件夹下的内容变成了 4 个:
其中 surefire-reports
里面包含了我们项目的测试报告:
其中,txt 文件记录了我们的测试日志信息:
xml 文件记录了我们测试的详细信息,包括测试的环境信息(如JDK版本、系统名称、时区、编码)等:
最后面展示了执行的测试类和测试的执行时间:
构建过程4:package
执行如下命令,可以对项目进行打包:
mvn package
执行结果如下:
我们可以看到,package 命令是先执行了 compile、test 之后才进行 package 打包。
target 目录中出现了我们打好的 jar 包:
构建过程5:install
执行如下命令,可以对项目进行安装:
mvn install
这个安装命令主要用于将我们的项目打包之后放到我们的本地仓库中,安装之后,我们可以在仓库中看到我们自己的包:
3.插件创建工程
-
创建工程:
mvn archetype:generate \ -DgroupId={project-packaging} \ -DartifactId={project-name} \ -Dversion={project-version} \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false
-
创建java工程
mvn archetype:generate -DgroupId=com.demo -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
-
创建web工程
mvn archetype:generate -DgroupId=com.demo -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false
其实对比之下,maven创建web项目的时候,只是多了一个web目录。
五、第一个Maven项目(IDEA生成)
1.创建 Maven 项目-jar
打开 IDEA,依次点击 File
-> New
-> Project...
选择 New Project
,填写好项目名称,选择 Maven工程,填写好所属组织名和项目ID,点击Create
。
这样 IDEA 就会自动帮我们创建好一个 Maven 项目了。
2.创建 Maven 项目-war
同样的我们可以选择Maven Archetype,从模板中选择web模板进行创建。
创建后项目如下:
2.定制 Maven 脚本
我们可以点击右上角运行的下拉框,选择Edit Configurations...
进行配置。
点击+
,选择 Maven
输入我们想要定制的构建过程,点击 OK。
我们就可以在右上角看到我们自己定制的 Maven 命令了,直接运行就相当于执行了相应的maven命令。
3.插件
-
Tomcat 7 运行插件
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build>
我们可以去 Maven Repository 搜一下 tomcat maven
,在里面找一个 org.apache.tomcat.maven
的包:
Maven Repository地址:https://mvnrepository.com/
点进去之后的第一个包就是我们需要的 tomcat 插件:
我们选择2.1的版本,复制相应的坐标:
注意,这里需要使用war包才能启动tomcat7,我们可以使用刚才创建好的web-project项目,复制后,如下所示:
IDEA右边的Maven窗口我们也可以看到新增了 tomcat7 的插件:
我们打开 tomcat7 插件,双击 tomcat7:run
,就可以运行 tomcat了。
我们可以看到tomcat7插件已经启动成功了,8080端口:
访问地址:http://localhost:8080/web-project
如果我们想定制端口和访问路径,可以进行如下配置:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
六、依赖管理
1.依赖配置
-
依赖: 指当前项目运行所需的 jar,一个项目可以设置多个依赖。
-
格式:
<!-- 设置当前项目所依赖的所有jar --> <dependencies> <!-- 设置具体的依赖 --> <dependency> <!-- 依赖所属组织id --> <groupId>junit</groupId> <!-- 依赖所属项目id --> <artifactId>junit</artifactId> <!-- 依赖版本号 --> <version>4.12</version> </dependency> </dependencies>
2.依赖传递
- 依赖具有传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
- 简介依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。
3.依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
- 特殊优先:当同级资源配置了相同资源的不同版本,后配置的覆盖先配置的。
4.可选依赖
-
可选依赖指对外隐藏当前所依赖的资源——不透明。
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <optional>true</optional> </dependency>
5.排除依赖
-
排除依赖指主动断开依赖的资源,被排除的资源无序指定版本——不需要。
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency>
6.依赖范围
- 依赖的 jar 默认情况可以在任何地方使用,可以通过 scope 标签设定其作用范围。
- 作用范围:
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
7.依赖范围传递性
- 带有依赖范围的资源在进行传递时,作用范围将受到影响。
(表中为空的部分表示依赖会消失掉。)
七、生命周期与插件
1.构建生命周期
- Maven 构建生命周期描述的是一次构建过程经历了多少个事件。
- Maven 对项目构建的生命周期划分为 3 套:
- clean:清理工作;
- default:核心工作,例如:编译,测试,打包,部署等。
- site:产生报告,发布站点等。
clean 生命周期
default 生命周期
执行生命周期中的任何一步(例如:compile),这一步之前的所有操作都需要进行一遍。
site 生命周期
2.插件
-
插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能。
-
默认maven在各个生命周期上绑定有预设的功能。
-
通过插件可以自定义其他功能。
Maven 官网插件地址: https://maven.apache.org/plugins/index.html
打开 Maven 官网插件页面:
我们可以看到,官网根据插件的类型进行了不同的分类:
- Core plugins:核心插件,包括 clean、compiler、deploy等;
- Packaging types/tools:打包插件,包括 jar、war、ejb、source等;
- Reporting plugins:报告插件,包括 javadoc等;
- Tools:工具插件,包括 antrun、artifact等。
3.打包源码插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<goals>
<!-- 打主程序的源码包 -->
<goal>jar</goal>
</goals>
<!-- 在生成测试资源文件时执行 -->
<phase>generate-test-resources</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
我们在插件页面选择 Packaging types/tools 类型中的 source
,点击进入。
我们可以看到,这里介绍了 source
插件的详细内容,其中包含了 5 种 Goals,这里我们主要说其中两种:
jar
:对主程序的源码打包;test-jar
:对测试程序的源码打包。
我们之前讲过构建生命周期/阶段(Build lifecycle & phases),和我们插件中用到的 <phase> 标签是一个含义,这里指的是在哪个阶段执行插件。
这里 <phase> 中的 generate-test-resources
指的就是我们之前提到的 default 构建生命周期中的一个阶段。
在项目中增加完 source 的插件配置后,我们可以在IDEA右侧看到相应的插件已经加载好了:
由于目前<phase>指定是在生成测试资源文件时执行,所以这里我们对项目进行 clean test
。
执行结束后,我们可以看到 target 文件夹下多了一个 source 源码包:
参考地址:
1.Maven技术快速入门,https://blog.csdn.net/Augenstern_QXL/article/details/118443858