Maven之一:基础
2022-09-17
Maven之一:基础
学习网站:http://mvnbook.com/index.html
简介
Maven英文:专家、内行
Maven:项目管理工具。可以对 Java 项目(后也可被应用于其他语言的管理)进行自动化的构建和依赖管理。
- 项目构建:即软件项目生产的整个过程
- 文档和代码的生成
- 代码编译、测试、打包
- 打包好的代码进行分发和部署
- 依赖管理
- 我们需要做的就是在 POM 文件里指定依赖 Jar 包的名称、版本号,Maven 会自动下载,并递归地去下载依赖的进一步依赖
- 快照依赖:使用快照依赖可以确保本地仓库中的每一个 Build 版本都是最新的
组成:
- 项目对象模型 POM(project object model)
- 项目生命周期 project lifecycle
- 依赖管理系统 dependency management system
- 各种插件
官网地址是: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仓库
仓库类型
- 本地(local)仓库:Maven 从远程仓库下载下来的构件都存放在本地仓库中,项目可以从本地 Maven 仓库中获取自己所依赖的文件。
- 中央(central)仓库:Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。中央仓库是 Maven 官方提供的,可通过 http://search.maven.org/ 来访问。
- 远程(remote)私服:私服一般是指公司内部使用的仓库。运行 Maven 时,Maven 所需要的任何构件都是从本地仓库获取的,但是如果本地仓库没有,它就会尝试从远程仓库中下载构件到本地仓库。如果 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包文件,就可以搭建一个公司内部的远程库,供众多开发人员使用。中央库可以认为是一个特殊的远程库。
依赖搜索顺序
本地 -> 找不到的话,找中央仓库 -> 中央仓库找不到,是否配置远程仓库 -> 无配置远程,则抛错(无法找到依赖的文件) -> 有配置远程,则找远程仓库 -> 若找不到,也抛错(无法找到依赖的文件)
若中途从中央或远程仓库找到依赖包,则下载到本地仓库供后续使用