Maven 是 Apache 软件基金会组织维护的一款自动化构建工具, 专注服务于 Java 平台的项目构建和依赖管理。
一、项目构建
项目构建就是以我们编写的 Java 代码、框架配置文件、 国际化等其他资源文件、 JSP 页面和图片等静态资源作为“原材料”, 去“生产”出一个可以运行的项目的过程。
1.1 构建的主要过程(Maven生命周期)
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将 Java 源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web
工程对应 war 包。
⑥安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行(实际中很少用mvn的方式部署)
注意点:运行任何一个阶段的时候,它前面的所有阶段都会被运行, 例如我们运行 mvn install 的时候,代码会被编译,测试,打包。
1.2 Maven 核心概念
Maven 能够实现自动化构建是和它的内部原理分不开的, 包含九个核心概念:
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合
二、依赖管理
2.1 依赖范围--compile/test/provided
(1)compile(默认):这是默认的范围,表示依赖在编译、测试和运行时都可用。
(2)provided: 依赖在编译时可用,但在运行时不可用(如lombok),或者运行时由 JDK 或者容器提供(例如servlet-api)。
- provided依赖不会被打包到最终的构建中。
- IDEA有时不引入provided的依赖(如:MAC--社区版)
3、test: 依赖在测试编译和测试运行时可用,但在正常运行时不可用。常用于单元测试框架和工具(例如 JUnit)。
2.2 依赖传递性
注意点:可以依赖传递的jar包,不必在每个模块都引入一次,只需在最底层的模块引入一次即可
备注--不会形成依赖传递的2种方式:
(1)scope=provided或scope=test的,不会形成依赖传递;
(2)<optional>true</optional>,不会形成依赖传递。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.3 依赖原则(解决jar冲突)
(1)路径最短者优先
(2)路径相同时先声明者优先
“声明”的先后顺序指的是 dependency 标签配置的先后顺序
2.4 依赖排除(略)
三、Maven仓库
3.1 Maven仓库分类
3.2 仓库中的文件
- Maven 的插件(详见本文--六、maven插件)
- 我们自己开发的项目的模块
- 第三方框架或工具的 jar 包
四、统一管理所依赖 jar 包版本的2种方式
4.1 第一种方式--properties自定义标签
步骤一:统一声明版本号
注意:其中 my.version 部分是自定义标签,可以随便命名
<properties>
<my.version>4.1.1.RELEASE</my.version>
</properties>
步骤二:引用前面声明的版本号
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${atguigu.spring.version}</version>
</dependency>
……
</dependencies>
4.2 第二种方式--继承
参考:Maven学习总结--继承_na_tion的专栏-CSDN博客
五、聚合
5.1 为什么要使用聚合?
作用:一次构建多个项目/模块,用于快速构建maven工程
将工程拆分为模块后, 需要手动逐个安装到仓库后依赖才能够生效。 修改源码后也需要逐个手动进行 clean 操作。 而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作。
5.2 如何配置聚合?
步骤一:创建一个模块作为总的聚合工程模块,该模块仅包含pom.xml文件并且打包方式设为pom
步骤二:在总的聚合工程中使用 modules/module 标签组合, 指定模块工程的相对路径即可。
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
注意:一键安装时,可以“智能”的进行依赖管理,即:不必严格按照依赖顺序写module
5.3 继承与聚合关系
六、Maven插件(pom.xml文件中的Build配置)
6.1 maven插件配置
(1)Maven是通过pom.xml来执行任务的,其中的build标签描述了如何来编译及打包项目,而具体的编译和打包工作是通过build中配置的 plugin 来完成;
(2)plugin配置不是必须的,因为默认情况下,Maven 会绑定以下几个插件来完成基本操作
(3)Spring Boot打成jar需要引入的插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.6.RELEASE</version>
</plugin>
</plugins>
</build>
(4)maven继承/聚合项目打成jar包方式(参考)
在各module中的pom文件中配置如下插件,然后在父pom所在目录执行命令(mvn clean install -Dmaven.test.skip=true。也可在父pom中点击package)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.6.RELEASE</version>
<configuration>
<!-- 指定该Main Class入口,即启动类的地址 -->
<mainClass>com.fuping3.UserApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<!--把依赖的包都打包到生成的Jar包中(zip解压后可以看见依赖的jar,反编译看不见依赖的jar)-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
6.2 maven指定JDK版本的3种方式
(1)通过项目中pom文件properties中特定标签指定
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
(2)通过项目中pom文件maven插件的方式指定
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- jdk的版本号 -->
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
(3)通过maven配置文件setting.xml指定
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
6.3 plugins和pluginManagement标签
两者的区别,和dependencies/dependencyManagement的区别非常类似,此处不再描述。
<!-- 父pom声明插件,并没有引入插件 -->
<build>
<finalName>loan-startup</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<!-- 子pom引入插件-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
</plugins>
</build>
七、Maven约定的目录结构
八、部署jar到本地仓库、远程私服
第三方jar包需要添加到本地仓库、远程私服,参考:使用maven工具安装第三方jar包到本地仓库和私服 - 寻梦君 - 博客园