# 一.常用命令
# 1.清理
#将以前编译得到的旧的 class 字节码文件删除
mvn clean
2
# 2.编译
#编译,将 Java 源程序编译成 class 字节码文件
mvn compile
2
# 3.测试
#测试,并生成测试报告
mvn test
2
# 4.打包
#打包,动态 web工程打 war包,Java工程打 jar 包
mvn pakage
2
# 5.安装到远程
#将项目生成 jar 包放在仓库中,以便别的模块调用
mvn install
2
# 6.打包安装
#打成jar包,并且抛弃测试用例打包
mvn clean install -Dmaven.test.skip=true
2
# 7.打包
#动态 web工程打 war包,Java工程打 jar 包 ,并且抛弃测试用例打包
mvn clean pakage -Dmaven.test.skip=true
2
# 二.下载与配置
# 1.依赖包
http://www.mvnrepository.com/
http://mvnrepository.com/
http://findjar.com
http://sourceforge.net/
2
3
4
5
6
7
# 2.配置
maven环境自定义配置
如果不指定maven home path
如下图所示,最新版的 2023.3.2 默认使用的是 Maven3.9.5
mvn -v
- 显示了 Maven3.9.5,说明需要指定自定义的 Maven 的文件夹
- 在终端中执行 maven 其实走的还是自定义的 Maven 文件夹
- 在 maven 的终端中走的其实是 idea 自带的 maven 版本,如果有自定义 Maven home path 则走自定义的
# 3.快速打开文件
# 4.jar 瘦身
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 5.环境配置
<profiles>
<profile>
<id>dev</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0-SNAPSHOT</tag.common.version>
<tag.api.version>1.0.0-SNAPSHOT</tag.api.version>
<tag.provider.version>1.0.0-SNAPSHOT</tag.provider.version>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0-SNAPSHOT</tag.common.version>
<tag.api.version>1.0.0-SNAPSHOT</tag.api.version>
<tag.provider.version>1.0.0-SNAPSHOT</tag.provider.version>
</properties>
</profile>
<profile>
<id>uat</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0</tag.common.version>
<tag.api.version>1.0.0</tag.api.version>
<tag.provider.version>1.0.0</tag.provider.version>
</properties>
</profile>
<profile>
<id>prd</id>
<properties>
<!--内部版本-->
<tag.common.version>1.0.0</tag.common.version>
<tag.api.version>1.0.0</tag.api.version>
<tag.provider.version>1.0.0</tag.provider.version>
</properties>
</profile>
</profiles>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 6.mvn 终端
- 方便
- 检测 maven 环境
# 三.jar 包下载
# 1.方式一
# 2.方式二
https://repo1.maven.org/maven2/
# 四.依赖说明
# 1.dependencyManagement
- 在该元素下声明的依赖不会实际引入到模块中,只有在 dependencies 元素下同样声明了该依赖,才会引入到模块中。该元素能够约束 dependencies 下依赖的使用
- 即 dependencies 声明的依赖若未指定版本,则使用 dependencyManagement 中指定的版本,否则将覆盖 dependencyManager 中的版本
- dependencyManager 可以传递给子模块,所以在子模块中可以引用父模块 dependencyManagement 定义好的依赖
<!--在dependencyManagement 声明的依赖不会实际引入到模块中 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
</dependencyManagement>
2
3
4
5
6
7
8
9
10
如果需要使用该依赖,则应该在 dependencies 中重新声明该依赖
<!--如果需要使用,在dependencies中声明该依赖,无须指定版本-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2
3
4
5
6
7
如果是在子类中,需要先引入父模块,再引用依赖
<!--引入父模块, parent标签可以理解为java中的继承关系-->
<parent>
<groupId>父类 groupId</groupId>
<artifactId>父类 artifactId</artifactId>
<version>父类 version</version>
</parent>
<!--如果需要使用,在dependencies中声明该依赖,无须指定版本-->
<dependencies>
<dependency>
<!--如果指定了版本号,则会覆盖父模块 dependencyManagement 定义的版本(不建议这
做,dependencyManagement的作用本来就是用来统一版本,防止依赖冲突)-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
使用 dependencyManagement 可以统一声明依赖版本,进行集中管理,避免依赖冲突
# 2.distributionManagement
distributionManagement 的作用是"分发构件至远程仓库":
mvn install 会将项目生成的构件安装到本地 Maven 仓库,mvn deploy 用来将项目生成的构件分发到远程 Maven 仓库。本地 Maven 仓库的构件只能供当前用户使用,在分发到远程 Maven 仓库之后,所有能访问该仓库的用户都能使用你的构件。
我们需要配置 POM 的 distributionManagement 来指定 Maven 分发构件的位置。给出 Maven 部署当前项目的构件到远程库时,关于远程库的配置。
<distributionManagement>
<repository>
<id>随便起</id>
<url>你自己maven环境下setting文件里面的私有库</url>
</repository>
<snapshotRepository>
<id>随便起t</id>
<url>你自己maven环境下setting文件里面的快照库</url>
</snapshotRepository>
</distributionManagement>
2
3
4
5
6
7
8
9
10
# 3.使用总结
- modules 中的 module 标签顺序,随意放置就好,不用按照子模块依赖顺序来设置,maven 会自动按照依赖顺序为你打包
- modules 中的 module 标签作用:modules 只能在模块的打包方式是 pom 的时候才能使用,比如 packaging 设置为 pom,modeule 标签中的名称是其他模块 artifactId 名称,无论该模块是否打包方式为 pom 模块的子模块,都是可以的;在对父模块进行 mvn clean install 的时候,所有在 module 标签中的模块都会自动按照模块之间的依赖顺序进行 mvn clean install
- 当我们从 maven 私服中下载子模块 jar 包的时候,该子模块 jar 包会去寻找用到的父模块 jar 包,主要目的是确定用到依赖的版本,所以我们把子模块 jar 包发布到 maven 仓库的时候,也一定要同步把父模块 jar 包发布到 maven 仓库,这样在下载子模块的时候才不会报错
- 发布打包方式为 pom 的父模块到 maven 仓库的时候,我们可以删除父模块的 module 标签吗,我认为是可以的,因为 module 标签的作用在上面 2 中已经说明了,所以它只和打包方式为 pom 的模块进行 mvn clean install 的时候有关,也就是说只和开发的时候 mvn clean install 有关,和其他的地方没啥关系
# 五.插件使用
# 1.下载插件
在插件市场搜索 Maven Helper 插件,即可使用插件。目前市面上大多数项目都使用 Maven 管理依赖,而 Maven Helper 简化了与 Maven 构建系统集成的复杂性。提供了依赖分析、冲突解决、依赖图可视化等功能,让我们能够更轻松地管理项目的依赖关系。
Maven Helper 插件有以下几个优势:
- 它可以让你快速地发现和解决 Maven 项目中的依赖冲突问题,避免因为冲突导致的运行时错误或者编译失败。
- 它可以让你清晰地查看 Maven 项目中的所有依赖关系,以及它们的来源和版本,方便你进行依赖管理和优化。
- 它可以让你一键地排除掉不需要的子依赖,减少项目中无用或重复的依赖,提高项目的质量和性能。
- 支持全局的 maven run/debug 命令在当前文件或当前模块下运行。
# 2.查看冲突
点击如图所示,可以看到有冲突的 jar 包
# 3.跳转树结构
- 跳到左边的依赖树,定位 jar 包位置
- 跳到引用位置,方便对冲突的引入删除
解决冲突:
当有冲突时,可以排除引入的包
# 4.跳转到 pom
点击跳转到源码即可跳转到 pom 的引用位置。
# 5.显示依赖树
# 六.maven 打包异常
# 1.问题描述
No compiler is provided in this environment. Perhaps you are running on a JRE。
# 2.添加配置
添加配置指定 maven 打包的 java 环境,可以解决问题,但是因为开发人员每个人配的不一样,这样的配置不利于团队开发,也就是治标不治本,要找到问题的根本原因
<build>
<plugins>
<plugin>
<!-- 指定maven编译的jdk版本 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<!--你的jdk地址-->
<executable>/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home/bin/javac</executable>
</configuration>
</plugin>
</plugins>
</build>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 3.检查配置
java --version #可以正常显示 mvn --version #可以正常显示
使用 mvn -version runtime 检查 maven 的运行环境
mvn -version runtime
查看 java 的环境配置
vim ~/.bash_profile
source ~/.bash_profile
2
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH:.
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH
2
3
4
5
6
# 4.java_home
执行下面的命令,如图,可以看到 2 个 home 目录,maven 使用的正是 JavaAppletPlugin.plugin 的 java_home,我们需要删除 JavaAppletPlugin.plugin 这个插件
/usr/libexec/java_home -V
# 5.删除插件
进入目录,需要使用 sudo 权限删除插件
cd /Library
cd Internet\ Plug-Ins
sudo rm -rf JavaAppletPlugin.plugin
2
3
4
5
检查 maven 的运行环境,和配置的 java 环境一致
mvn -version runtime
再次执行 maven 的打包命令,顺利打包.