2MUCH

Maven之一:基础

2022-09-17


Maven之一:基础

学习网站:http://mvnbook.com/index.html

简介

Maven英文:专家、内行

Maven:项目管理工具。可以对 Java 项目(后也可被应用于其他语言的管理)进行自动化的构建依赖管理

组成:

官网地址是:https://maven.apache.org/index.html

下载和安装

官网下载地址是:https://maven.apache.org/download.cgi

Mac安装maven步骤:

参考链接:https://blog.csdn.net/m0_67400973/article/details/123656632

1、下载Binary zip archive(如目前的最新版 apache-maven-3.8.6-bin.zip),解压并重命名文件夹为maven(或者外面再套一层maven文件夹,不需要修改原有的文件夹名称)

2、配置环境变量

编辑文件 .bash_profile:

vim ~/.bash_profile
# 添加以下内容
export M2_HOME=/Users/huangxindi/study/maven #这里是你maven目录的路径
export PATH=$PATH:$M2_HOME/bin

编辑文件 .zshrc

vim ~/.zshrc
# 添加以下内容
export M2_HOME=/Users/huangxindi/study/maven #这里是你maven目录的路径
export PATH=$PATH:$M2_HOME/bin

3、使修改立即生效

source ~/.bash_profile
source ~/.zshrc

4、验证maven是否安装成功

mvn -v
# 输出类似以下结果,证明安装成功
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /Users/huangxindi/study/maven
Java version: 17.0.4, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-17.0.4.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "12.5.1", arch: "aarch64", family: "mac"

Maven仓库

仓库类型

本地仓库

本地仓库只有在第一次执行maven命令时才会被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

我们可以将本地仓库理解为 “缓存”,目的是存放 Jar 包。开发项目时首先会从本地仓库中获取 Jar 包,当无法获取指定 Jar 包的时候,本地仓库会从远程仓库(或中央仓库)中下载 Jar 包,并 “缓存” 到本地仓库中以备将来使用。这样一来,本地仓库会随着项目的积累越变越大。

修改本地仓库路径(注意,前方犯蠢现场)

可以通过修改 %M2_HOME%\conf 目录中的 Maven 的 settings.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> 参数值改为其他路径
<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/Users/huangxindi/study/localRepository</localRepository>
  -->

验证本地仓库的下载内容结果 mvn help:system

# 从中心仓库下载到本地仓库的文件
mvn help:system 
# 但是执行刚开始提示download都正常,最后有如下报错
...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml
Downloaded from central: https://repo.maven.apache.org/maven2/org/codehaus/mojo/maven-metadata.xml (21 kB at 11 kB/s)
[WARNING] Could not transfer metadata org.apache.maven.plugins/maven-metadata.xml from/to central (https://repo.maven.apache.org/maven2): transfer failed for https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml
[WARNING] org.apache.maven.plugins/maven-metadata.xmlfailed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer metadata org.apache.maven.plugins/maven-metadata.xml from/to central (https://repo.maven.apache.org/maven2): transfer failed for https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  02:27 min
[INFO] Finished at: 2022-09-17T20:55:04+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] No plugin found for prefix 'help' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/Users/huangxindi/.m2/repository), central (https://repo.maven.apache.org/maven2)] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException

看了这篇博客(https://blog.csdn.net/weixin_44077693/article/details/125026771),也是相同的设置和问题,了解到settings.xml 文件的localRepository的设置不能和maven文件夹同级,改为设在maven文件夹里面就可以了。于是修改localRepository参数,并新建相关目录,然后重新执行下载。

<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/Users/huangxindi/study/maven/localRepository</localRepository>
  -->
# 重新执行插件下载
mvn help:system
# 执行结果成功
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  07:49 min
[INFO] Finished at: 2022-09-17T21:17:17+08:00
[INFO] ------------------------------------------------------------------------

可是,不知道为啥,我打开localRepository参数所在的目录,是空的。。。

到默认目录去看,原来还是下载到了默认目录中,这。。。

huangxindi@huangxindideiMac repository % pwd
/Users/huangxindi/.m2/repository
huangxindi@huangxindideiMac repository % ls -l
total 0
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:11 aopalliance
drwxr-xr-x  4 huangxindi  staff  128  9 17 21:13 com
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:11 commons-collections
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:12 commons-io
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:11 commons-lang
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:13 io
drwxr-xr-x  5 huangxindi  staff  160  9 17 21:10 javax
drwxr-xr-x  4 huangxindi  staff  128  9 17 21:11 net
drwxr-xr-x  9 huangxindi  staff  288  9 17 21:13 org
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:13 xmlpull

我是有看到以下这种说法,但是本地仓库的文件夹我明明有手动创建啊,为啥还是跑到默认路径去了。。

本地仓库的文件目录,一定要自己手动创建,否则即使修改了settings.xml文件也会将下载的东西放到.m2目录下

然后,我悲催地发现,原来我之前在settings.xml 文件的localRepository的设置语句,还处在注释状态(被包在<!-- -->中间),所以一直没生效修改。。。于是删除默认的本地仓库插件,重新修改路径,重新下载。。。

<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
-->
<localRepository>/Users/huangxindi/study/maven/localRepository</localRepository>
# 重新执行插件下载
mvn help:system
# 执行结果成功
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11:13 min
[INFO] Finished at: 2022-09-17T22:01:37+08:00
[INFO] ------------------------------------------------------------------------
# 终于在自定义的本地仓库文件夹中看到了下载的插件
huangxindi@huangxindideiMac localRepository % pwd
/Users/huangxindi/study/maven/localRepository
huangxindi@huangxindideiMac localRepository % ls -l
total 0
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:55 aopalliance
drwxr-xr-x  4 huangxindi  staff  128  9 17 21:56 com
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:55 commons-collections
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:56 commons-io
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:56 commons-lang
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:56 io
drwxr-xr-x  5 huangxindi  staff  160  9 17 21:55 javax
drwxr-xr-x  4 huangxindi  staff  128  9 17 21:56 net
drwxr-xr-x  9 huangxindi  staff  288  9 17 21:56 org
drwxr-xr-x  3 huangxindi  staff   96  9 17 21:56 xmlpull

中央仓库

中央仓库由 Maven 社区管理,不需要配置,但需要通过网络才能访问。

在maven的安装目录下,有此插件/lib/maven-model-builder-${version}.jar,打开可以找到超级POM(\org\apache\maven\model\pom-4.0.0.xml)。它是所有Maven POM的父POM,所有Maven项目继承该配置。

<repositories>
<repository>
  <id>central</id>
  <name>Central Repository</name>
  <url>https://repo.maven.apache.org/maven2</url> # 此处配置中央库地址
  <layout>default</layout>
  <snapshots>
	<enabled>false</enabled>
  </snapshots>
</repository>
</repositories>

主要中央仓库地址

1、阿里中央仓库

<repository>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>

2、maven.apache.org 中央仓库

<repository>
    <id>central-repos</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
</repository>

3、spring.io 中央仓库

<repository>
    <id>springsource-repos</id>
    <name>SpringSource Repository</name>
    <url>http://repo.spring.io/release/</url>
</repository>

远程私服仓库

如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 Jar 文件。

Maven远程库也是位于网络上的存储库。例如一个公司可能有很多共享的jar包文件,就可以搭建一个公司内部的远程库,供众多开发人员使用。中央库可以认为是一个特殊的远程库。

依赖搜索顺序

本地 -> 找不到的话,找中央仓库 -> 中央仓库找不到,是否配置远程仓库 -> 无配置远程,则抛错(无法找到依赖的文件) -> 有配置远程,则找远程仓库 -> 若找不到,也抛错(无法找到依赖的文件)

若中途从中央或远程仓库找到依赖包,则下载到本地仓库供后续使用

参考链接

http://mvnbook.com/index.html