楔子
最近小娇娇同学有点烦恼,她明明执行了install,相关项目的依赖却没有变化,于是她不停地clean、install,项目有时候能行,有时候不行,所以她一脸懵B的找到小七帮忙看看原因,当然像小七这么乐于助人的绅士肯定是义不容辞呀,于是手把手带她入门。
第一章、Maven安装
1.1、Windows下安装
1.1.1、下载
1.前往http://maven.apache.org/download.cgi下载最新版的Maven程序
1.1.2、安装
解压压缩包即可
1.1.3、配置环境变量
右键“此电脑->属性->高级系统设置->环境变量”
在Path中添加maven路径
1.1.4、检查安装是否成功
按下windows键 + R键
,输入cmd
,在弹出的命令行窗口中,输入mvn -v
能够正确输出版本信息,则证明mvn安装成功。
第二章、Maven基本概念
2.1、概要
Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以管理一个项目的构建,发布和文档。(摘于官方网站)
2.2、Maven项目结构
2.2.1、Maven项目标准结构
maven-demo(项目名称)
|---------pom.xml(项目配置文件)
|---------src
|---------main(主程序目录)
|---------java(主程序的Java源文件目录)
|---------resources(主程序的资源文件目录)
|---------test(测试程序目录)
|---------java(测试程序的Java源文件目录)
|---------resources(测试程序的资源文件目录)
2.2.2、pom文件
所有 POM 文件一般都需要 project 根元素和三个必需字段:groupId,artifactId,version。
例子:
<?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">
<groupId>sheep-web-demo</groupId>
<artifactId>sheep-web-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
2.3、Maven 编译
2.3.1、创建Maven项目
创建一个空项目
2.3.2、创建src 文件
2.3.3、编写 pom 文件
<?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>maven-text</groupId>
<artifactId>maven-text</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
2.3.4、执行编译命令
mvn compile
出现以下命令则为编译成功
2.4、Maven打包
mvn package
2.5、Maven单元测试
2.5.1、编写测试类
/**
* 测试类
*
* @author 第七人格
* @date 2021/3/25 21:00
*/
public class TestMaven {
public void testMaven(){
System.out.println("============This is test===========");
}
}
2.5.2、执行测试命令
mvn test
注意:必须是Test开头的类名与test 开头的方法才会执行(约定)。
2.6、配置文件常用参数(settings.xml)
2.6.1、本地仓库地址
<localRepository>....</localRepository>
2.6.2、私服相关
<server>
<id>releases</id>
<username>admin</username>
<password>123456</password>
</server>
2.6.3、镜像
<mirror>
<!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>planetmirror.com</id>
<!--镜像名称 -->
<name>aliyun</name>
<!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo1.maven.org/maven2)的镜像,就需要将该元素设置成central。这必须和中央仓库的id central完全一致。-->
<mirrorOf>central</mirrorOf>
</mirror>
第三章、Maven核心配置
3.1、Maven依赖管理
3.1.1、依赖配置
通过3要素(groupId,artifactId,version)定位,写在标签
<dependencies> <dependency>......</dependency></dependencies>
内,如下所示
<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
</dependency>
...
...
可添加多个依赖
...
...
</dependencies>
...
</project>
3.1.2、依赖传播特性
我们的项目通常需要依赖第三方组件,而第三方组件又会依赖其它组件遇到这种情况Maven会将依赖网络中的所有节点都会加入ClassPath当中,这就是Maven的依赖传播特性。
3.1.3、依赖优先原则
基于依赖传播特性,导致整个依赖网络会很复杂,难免会出现相同组件不同版本的情况。Maven此时会基于依赖优先原则选择其中一个版本。
第一原则:最短路径优先。
第二原则:相同路径下配置在前的优先。
3.1.4、可选依赖
在
<dependency>
标签内新增
<optional>true</optional>
表示,默认是不可选的。可选依赖不会被传递。
3.1.5、排除依赖
<exclusions>
<exclusion>
<groupId>....</groupId>
<artifactId>....</artifactId>
</exclusion>
</exclusions>
3.1.6、依赖范围
类型 | 范围 | 例子 |
---|---|---|
compile(默认) | 编译打包都会依赖 | |
provided | 编译依赖,打包不依赖 | servlet-api.jar |
runtime | 打包依赖,编译不依赖 | mysql-connector-java.jar |
test | 编译允许测试用例依赖 | junit.jar |
system | 表示由系统中CLASSPATH指定。编译时依赖,打包不依赖 |
语法如下:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<!-- 设置依赖范围,主要可取值:compile、test、provided,默认不配就是compile -->
<scope>compile</scope>
</dependency>
3.2、项目聚合
聚合需要个父工程,然后使用
<modules>
进行配置。
pom文件如下:
项目工程结构如下
该示例是小七的一个记录demo,项目地址:
https://gitee.com/diqirenge/sheep-web-demo
3.3、项目继承
继承是指子工程直接继承父工程当中的属性、依赖、插件等配置,避免重复配置。
三个配置子工程都可以进行重写,重写之后以子工程的为准。在父工程中使用<dependencyManagement>
管理依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>....</groupId>
<artifactId>....</artifactId>
<version>....</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程中,可以不再写
<version>
,只需要写坐标即可
<dependency>
<groupId>....</groupId>
<artifactId>....</artifactId>
</dependency>
第四章、Maven生命周期
4.1、概念
maven 总共包含三大生生命周期
-
clean Lifecycle :清理生命周期,用于于清理项目。
-
default Lifecycle:默认生命周期,用于编译、打包、测试、部署等。
-
site Lifecycle 站点文档生成,用于构建站点文档。
注意点:default Lifecycle的生命周期,位于后面的节点执行时,总会先执行前面的节点。
4.2、意义
1、统一步骤,规范化
2、解耦,便于拓展
4.3、对照表
生命周期(lifecycle) | 阶段(phase) | 描述(describe) |
---|---|---|
clean Lifecycle | pre-clean | 预清理 |
clean | 清理 | |
post-clean | 清理之后 | |
default Lifecycle | validate | 验证 |
initialize | 初始化 | |
generate-sources | ||
process-sources | ||
generate-resources | ||
process-resources | ||
compile | 编译 | |
process-classes | ||
generate-test-sources | ||
process-test-sources | ||
generate-test-resources | ||
process-test-resources | ||
test-compile | 编译测试类 | |
process-test-classes | ||
test | 执行测试 | |
prepare-package | 构建前准备 | |
package | 打包构建 | |
pre-integration-test | ||
integration-test | ||
post-integration-test | ||
verify | 验证 | |
install | 上传到本地仓库 | |
deploy | 上传到远程仓库 | |
site Lifecycle | pre-site | 准备构建站点 |
site | 构建站点 | |
post-site | 构建站点之后 | |
site-deploy | 站点部署 |
第五章、Maven插件
5.1、语法
语法如下
<plugin>
<groupId>....</groupId>
<artifactId>....</artifactId>
<version>...</version>
<executions>
<execution>
<id>执行器命名</id>
<phase>执行的阶段</phase>
<goals>
<goal>执行一组目标或功能</goal>
</goals>
<configuration>
执行目标所需的配置文件
</configuration>
</execution>
</executions>
</plugin>
5.2、常用插件
自动拷贝jar包到target目录
<build>
<plugins>
<!-- 自动拷贝jar包到target目录 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- ${project.build.directory}为Maven内置变量,缺省为target -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- 表示是否不包含间接依赖的包 -->
<excludeTransitive>false</excludeTransitive>
<!-- 表示复制的jar文件去掉版本信息 -->
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
更多插件:https://maven.apache.org/plugins/index.html
5.3、自定义插件开发
5.3.1、创建Maven 插件项目
5.3.2、设定packaging 为Maven-plugin
<packaging>maven-plugin</packaging>
5.3.3、添加插件依赖
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.1</version>
</dependency>
</dependencies>
5.3.4、编写插件实现逻辑
/**
* 自定义插件
*
* @author 第七人格
* @date 2021/03/25
*/
@Mojo(name = "sevenPlugin")
public class SevenPlugin extends AbstractMojo {
@Parameter
String sex;
@Parameter
int age;
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info(String.format("seven sex=%s,age=%s" ,sex, age));
}
}
5.3.5、打包构建插件
mvn package
5.3.6、安装插件
发布到本地仓库,本地其他项目可以调用
mvn install
5.3.7、发布插件
发布到仓库,其他项目可以调用
mvn deploy
第六章、nexus 私服搭建
6.1、下载
下载地址:https://www.sonatype.com/nexus/repository-oss/download
6.2、安装
解压后,进入bin目录下
运行命令:nexus.exe /run
出现以下文字,则启动成功
6.3、初始密码
初始密码位于“\sonatype-work\nexus3”下的“admin.password”里
6.4、创建代理仓库
这里填阿里云地址
http://maven.aliyun.com/nexus/content/groups/public/
6.5、设置代理仓库
6.6、项目配置
在我们的pom文件中加入以下代码
<distributionManagement>
<repository>
<id>releases</id>
<name>maven-releases</name>
<url>http://127.0.0.1:8081/repository/maven-releases/</url>
<uniqueVersion>true</uniqueVersion>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>maven-snapshots</name>
<url>http://127.0.0.1:8081/repository/maven-snapshots/</url>
<uniqueVersion>true</uniqueVersion>
</snapshotRepository>
</distributionManagement>
如果你的版本带着releases,也就是 0.0.1-releases,就会发布到 maven-releases。
如果你的版本带着snapshots,也就是 0.0.1-snapshots,就会发布到 maven-snapshots。
第七章、IntelliJ IDEA和Maven
7.1、插件推荐
Maven Helper可视化maven操作(更多插件请移步
https://blog.csdn.net/a18602320276/article/details/114637244?spm=1001.2014.3001.5501)
7.1.1、快速解决依赖冲突
pom文件添加以下代码,他们依赖的spring-beans 的版本都是5.2.8,所以会造成依赖冲突。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
启动报错
解决依赖冲突
红色就是有依赖冲突的地方,选中右键“exclude”即可,快速排除依赖
7.2、maven配置
7.3、项目创建
第八章、从开发问题回顾Maven
8.1、问题一:小娇娇同学clean、install为什么有时候有效,有时候无效。
clean错项目了,项目A依赖于项目B,如果项目B变化了,应该install的是项目B,而不是项目A,项目A只需要重新导入相关依赖即可。参考第三章、项目依赖管理。
8.2、问题二:依赖冲突,导致项目启动报错。
最常见的就是 log4j与slf4j的依赖冲突,这个时候排除相关依赖即可。参考3.1.5和7.1.1。
8.3、问题三:明明仓库里有jar包,idea却找不到
(1)idea的问题,重启后生效
(2)jar包下载不完成,仓库删除后重新下载,建议配置国内镜像,参考2.6.2。
第九章、后记
小七以前写博客,基本都是出于自己记录的目的。同事和朋友,都吐槽过看不懂,写得太糙了,自己懂得和分享出来,让大家懂得是完全不同的,从以后每篇文章,小七都慢慢写,争取和这篇文章一样,写7、8个小时(忘了吃晚饭了o(╥﹏╥)o)。