最近 Java 学到 Maven,在修改 repository 路径(保护C盘空间)的问题上遇到了阻塞, 所幸终于搞清楚了,在此记录一下。
手动安装 MAVEN
首先自己尝试手动安装了一下Maven,就是官网下载,解包,配置环境变量,手动修改 conf/settings.xml 下的配置文件(改 <localRepository>
),一切顺利。
过程中发现有的每个人说的配置Maven安装目录的环境变量名不一样,包括 MAVEN_HOME 和 M2_HOME,网上的说法五花八门,相同点是它们都指向 Maven 的安装目录,不同点:
- 有说操作系统不同:MAVEN_HOME 主要是Linux和macOS在用,M2_HOME主要是windows在用。
- 有说是Maven版本不同:
- Maven 1.x 使用 MAVEN_HOME
- Maven 2.x 引入 M2_HOME,在 Maven 2 及更高版本使用;MAVEN_HOME 也可以使用
- Maven 3.x 推荐使用 M2_HOME;MAVEN_HOME 不再推荐使用
- 基于这个说法,为了兼容性,推荐把这两个环境变量都配上
- 有说是每个工具识别 Maven 安装目录所用的环境变量不同:例如我安装的 IDEA 版本,对这两个都识别
我最终的做法是最少配置原则 ,所以这两个环境变量我都没有配置,仅在PATH中添加了 Maven 安装目录下的 bin 路径,以保证我可以使用 mvn
命令行工具就行,这样在学习过程中才好暴露出可能的问题。
IDEA 指定 Maven
后来想到自己之前练习 Java,安装的 IDEA(2023)是如何指定 Maven 的,打开 File -> settings
搜索发现,IDEA 本身就内置了 Maven,并且也支持手动指定自己安装的Maven路径:
- Bundle (Maven 3) :是 IntelliJ IDEA 自带的 Maven 版本。当你选择这个选项时,IDEA 将使用其内置的 Maven 版本来执行 Maven 相关的任务,而不需要你在你的计算机上单独安装 Maven。这个内置的 Maven 版本通常是 Maven 3.x 版本。使用内置的 Maven 版本可以确保 IDEA 与 Maven 的兼容性,并且不需要额外的配置。安装路径是
IDEA安装目录\plugins\maven\lib\maven3
- Use Maven wrapper :是一个 Maven 提供的工具,它允许项目在不要求用户全局安装 Maven 的情况下运行 Maven 命令。当你选择这个选项时,IDEA 将使用项目中的 Maven wrapper 来执行 Maven 任务。Maven wrapper 通常包含在项目的
.mvn
目录中,它会自动下载并使用与项目pom.xml
文件中指定的 Maven 版本相匹配的 Maven 版本。这样做的好处是,不同的项目可以独立地使用不同版本的 Maven,而不会相互冲突。 - 本地路径:如果安装过其他 Maven(IDEA会自动识别排除内置的Maven),并配置了安装目录的环境变量(MAVEN_HOME 或 M2_HOME),就会出现第三个选项,显示的就是Maven 的安装路径
所以为了方便,我将之前安装的 Maven 删掉,PATH 环境变量重新配置为 IDEA 内置 Maven 的地址。
IDEA 修改 repository 路径
因为 Maven 可以管理依赖包,那就需要考虑依赖安装的问题,考虑到 C 盘压力很大,我就想修改依赖存储的路径。
在手动安装 Maven 过程中修改配置文件 conf/settings.xml
就行,在 IDEA 是怎样的呢,于是搜索之后也是五花八门,最终选择了和手动安装 Maven 一样的方式,修改 IEDA 内置 Maven 安装目录下的配置文件。
xml
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
将 <localRepository>/path/to/local/repo</localRepository>
的注释放开,将 /path/to/local/repo
改成自己的地址就行。
再说下遇到的问题
一开始偷懒在网上搜的方法产生了一些问题,该方法让我直接修改 File -> Settings
中的配置:
修改 Local repository
并勾选 Override
即可。
修改后发现,它仅对当前项目生效,这个现象立马让我想到了用户配置和工作区配置。而上面的 User settings file
明显是用户配置,我查看了下,本地也并没有这个文件(因为我也没配过)。
那只能是工作区配置了,在 .idea/workspace.xml
中果然发现了这段多出来的内容:
xml
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="localRepository" value="E:\software\idea-maven\.m2\repository" />
</MavenGeneralSettings>
</option>
</component>
想来还是用传统的办法比较靠谱,所以直接去修改 Maven 安装目录下的配置文件。
查看了它的注释:
xml
<!--
| This is the configuration file for Maven. It can be specified at two levels:
|
| 1. User Level. This settings.xml file provides configuration for a single user,
| and is normally provided in ${user.home}/.m2/settings.xml.
|
| NOTE: This location can be overridden with the CLI option:
|
| -s /path/to/user/settings.xml
|
| 2. Global Level. This settings.xml file provides configuration for all Maven
| users on a machine (assuming they're all using the same Maven
| installation). It's normally provided in
| ${maven.conf}/settings.xml.
|
| NOTE: This location can be overridden with the CLI option:
|
| -gs /path/to/global/settings.xml
|
| The sections in this sample file are intended to give you a running start at
| getting the most out of your Maven installation. Where appropriate, the default
| values (values used when the setting is not specified) are provided.
|
|-->
翻译过来就是:
xml
这是Maven的配置文件。它可以在两个级别上指定:
1.用户级别: 此 settings.xml 文件为单个用户提供配置,通常在 ${user.home}/.m2/settings.xml 中提供。
注意:此位置可以用 CLI 选项覆盖:
-s/path/to/user/settings.xml
2.全局层面: 此 settings.xml 文件为机器上的所有 Maven 用户提供配置(假设他们都使用相同的 Maven 安装)。它通常在 ${maven.conf}/settings.xml 中提供。
注意:此位置可以用 CLI 选项覆盖:
-gs/path/to/global/settings.xml
这个示例文件中的部分旨在给你一个运行的初始配置,让你最大限度地利用你的 Maven 安装。在适当的地方,提供了默认值(当设置未指定时使用的值)。
所以它果然是全局配置文件 。修改后,重启 IDEA,Local repository
自动变成了全局配置的路径。
又查了下IDEA在使用配置的优先级:
- 命令行参数:直接在命令行中指定的参数,具有最高的优先级。
.mvn/maven.config
:项目特定的 Maven 配置,可以覆盖用户和全局设置。想来与那个 Use Maven wrapper 和Use settings from .mvn/maven.config
有关。.idea/workspace.xml
:IDEA 特定的工作区设置。- 用户级别的
settings.xml
:位于用户主目录下的.m2
文件夹中,包含用户专属的 Maven 配置。 全局 settings.xml
:位于 Maven 安装目录下的conf
文件夹中,包含全局的 Maven 配置。- 项目
pom.xml
:定义项目的构建、依赖等信息。
其他好像还有环境变量,不过我目前用不到,就不过多研究了。