# 一.常用命令

# 1.清理

#将以前编译得到的旧的 class 字节码文件删除
mvn clean
1
2

# 2.编译

#编译,将 Java 源程序编译成 class 字节码文件
mvn compile
1
2

# 3.测试

#测试,并生成测试报告
mvn test
1
2

# 4.打包

#打包,动态 web工程打 war包,Java工程打 jar 包
mvn pakage
1
2

# 5.安装到远程

#将项目生成 jar 包放在仓库中,以便别的模块调用
mvn install
1
2

# 6.打包安装

#打成jar包,并且抛弃测试用例打包
mvn clean install -Dmaven.test.skip=true
1
2

# 7.打包

#动态 web工程打 war包,Java工程打 jar 包 ,并且抛弃测试用例打包
mvn clean pakage -Dmaven.test.skip=true
1
2

# 二.下载与配置

# 1.依赖包

http://www.mvnrepository.com/

http://mvnrepository.com/

http://findjar.com

http://sourceforge.net/
1
2
3
4
5
6
7

# 2.配置

maven环境自定义配置

image-20230330113648575

如果不指定maven home path

如下图所示,最新版的 2023.3.2 默认使用的是 Maven3.9.5

mvn -v

  • 显示了 Maven3.9.5,说明需要指定自定义的 Maven 的文件夹
  • 在终端中执行 maven 其实走的还是自定义的 Maven 文件夹
  • 在 maven 的终端中走的其实是 idea 自带的 maven 版本,如果有自定义 Maven home path 则走自定义的

image-20240130204324643

image-20240130204140740

# 3.快速打开文件

image-20231215020705437

# 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>
1
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>
1
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 环境

image-20240130204625474

# 三.jar 包下载

# 1.方式一

image-20231022231714340

# 2.方式二

https://repo1.maven.org/maven2/

image-20230116215913485

# 四.依赖说明

# 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>
1
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>
1
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>
1
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>
1
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 命令在当前文件或当前模块下运行。

image-20231215020841295

# 2.查看冲突

点击如图所示,可以看到有冲突的 jar 包

image-20231215015132376

# 3.跳转树结构

  1. 跳到左边的依赖树,定位 jar 包位置
  2. 跳到引用位置,方便对冲突的引入删除

image-20231215015244201

解决冲突:

当有冲突时,可以排除引入的包

image-20240922163552917

# 4.跳转到 pom

点击跳转到源码即可跳转到 pom 的引用位置。

image-20231215020955989

# 5.显示依赖树

image-20231215021634080

# 六.maven 打包异常

# 1.问题描述

No compiler is provided in this environment. Perhaps you are running on a JRE。

image-20230207165444272

# 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>
1
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
1

查看 java 的环境配置

vim ~/.bash_profile
source ~/.bash_profile
1
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
1
2
3
4
5
6

# 4.java_home

执行下面的命令,如图,可以看到 2 个 home 目录,maven 使用的正是 JavaAppletPlugin.plugin 的 java_home,我们需要删除 JavaAppletPlugin.plugin 这个插件

/usr/libexec/java_home -V
1

image-20231022231656143

# 5.删除插件

进入目录,需要使用 sudo 权限删除插件

cd /Library

cd Internet\ Plug-Ins

 sudo rm -rf JavaAppletPlugin.plugin
1
2
3
4
5

检查 maven 的运行环境,和配置的 java 环境一致

mvn -version runtime
1

image-20230207170016617

再次执行 maven 的打包命令,顺利打包.

上次更新: 10/29/2024, 10:27:50 AM