什么是Maven仓库
在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文
件,如log4j.jar,junit.jar等等。每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复。
重复永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难。此外,如果你使用版本管理工具,如
SVN(你没有使用版本管理工具?马上试试SVN吧,它能帮你解决很多头疼的问题),你需要将大量的jar文件提交到代码库里,可是版本管理工具在处理二
进制文件方面并不出色。
Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依
赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等
等,因此Maven项目可以方便的进行依赖版本管理。你也不在需要提交JAR文件到SCM仓库中,你可以建立一个组织层次的Maven仓库,供所有成员使
用。
简言之,Maven仓库能帮助我们管理构件(主要是JAR)。
本地仓库 vs. 远程仓库
运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
比如说,你的项目配置了junit-3.8的依赖,在你运行mvn test
的时候,Maven需要使用junit-3.8的jar文件,它首先根据坐标查找本地仓库,如果找到,就直接使用。如果没有,Maven会检查可用的远程
仓库配置,然后逐个尝试这些远程仓库去下载junit-3.8的jar文件,如果远程仓库存在该文件,Maven会将其下载到本地仓库中,继而使用。如果
尝试过所有远程仓库之后,Maven还是没能够下载到该文件,它就会报错。
Maven缺省的本地仓库地址为${user.home}/.m2/repository
。也就是说,一个用户会对应的拥有一个本地仓库。
你也可以自定义本地仓库的位置,修改${user.home}/.m2/settings.xml
:
<settings>
...
<localRepository>D:\java\repository</localRepository>
...
</settings>
你还可以在运行时指定本地仓库位置:
mvn clean install -Dmaven.repo.local=/home/juven/myrepo/
还有一点需要理解的是,当我们运行install的时候,Maven实际上是将项目生成的构件安装到了本地仓库,也就是说,只有install了之后,其它项目才能使用此项目生成的构件。
了解了本地仓库,接着了解一下Maven缺省的远程仓库,即Maven中央仓库。
安装好Maven之后,我们可以建立一个简单的项目,配置一些简单的依赖,然后运行mvn clean
install,项目就构建好了。我们没有手工的去下载任何jar文件,这一切都是因为Maven中央仓库的存在,当Maven在本地仓库找不到需要的
jar文件时,它会查找远程仓库,而一个原始的Maven安装就自带了一个远程仓库——Maven中央仓库。
这个Maven中央仓库是在哪里定义的呢?在我的机器上,我安装了maven-2.0.10,我可以找到这个文件:${M2_HOME}/lib/maven-2.0.10-uber.jar
,打开该文件,能找到超级POM:\org\apache\maven\project\pom-4.0.0.xml
,它是所有Maven POM的父POM,所有Maven项目继承该配置,你可以在这个POM中发现如下配置:
-
<
repositories
>
-
<
repository
>
-
<
id
>
central
</
id
>
-
<
name
>
Maven Repository Switchboard
</
name
>
-
<
layout
>
default
</
layout
>
-
<
url
>
http://repo1.maven.org/maven2
</
url
>
-
<
snapshots
>
-
<
enabled
>
false
</
enabled
>
-
</
snapshots
>
-
</
repository
>
-
</
repositories
>
关于远程仓库的配置,下面的小节我会详细解释,这里我们只要知道,中央仓库的id为central,远程url地址为http://repo1.maven.org/maven2,它关闭了snapshot版本构件下载的支持。
在POM中配置远程仓库
前面我们看到超级POM配置了ID为central的远程仓库,我们可以在POM中配置其它的远程仓库。这样做的原因有很多,比如你有一个局域网的
远程仓库,使用该仓库能大大提高下载速度,继而提高构建速度,也有可能你依赖的一个jar在central中找不到,它只存在于某个特定的公共仓库,这样
你也不得不添加那个远程仓库的配置。
这里我配置一个远程仓库指向中央仓库的中国镜像:
-
<
project
>
-
...
-
<
repositories
>
-
<
repository
>
-
<
id
>
maven-net-cn
</
id
>
-
<
name
>
Maven China Mirror
</
name
>
-
<
url
>
http://maven.net.cn/content/groups/public/
</
url
>
-
<
releases
>
-
<
enabled
>
true
</
enabled
>
-
</
releases
>
-
<
snapshots
>
-
<
enabled
>
false
</
enabled
>
-
</
snapshots
>
-
</
repository
>
-
</
repositories
>
-
<
pluginRepositories
>
-
<
pluginRepository
>
-
<
id
>
maven-net-cn
</
id
>
-
<
name
>
Maven China Mirror
</
name
>
-
<
url
>
http://maven.net.cn/content/groups/public/
</
url
>
-
<
releases
>
-
<
enabled
>
true
</
enabled
>
-
</
releases
>
-
<
snapshots
>
-
<
enabled
>
false
</
enabled
>
-
</
snapshots
>
-
</
pluginRepository
>
-
</
pluginRepositories
>
-
...
-
</
project
>
我们先看一下<repositories>的配置,你可以在它下面添加多个<repository>
,每个<repository>都有它唯一的ID,一个描述性的name,以及最重要的,远程仓库的url。此
外,<releases><enabled>true</enabled></releases>告诉
Maven可以从这个仓库下载releases版本的构件,
而<snapshots><enabled>false</enabled></snapshots>
告诉Maven不要从这个仓库下载snapshot版本的构件。禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控
制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持。
关于<repositories>的更详细的配置及相关解释,请参考:http://www.sonatype.com/books/maven-book/reference_zh/apas02s08.html。
至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件(Maven的所有实际行为都由其插件完成)。该元素的内部配置和<repository>完全一样,不再解释。
在settings.xml中配置远程仓库
我们知道了如何在POM中配置远程仓库,但考虑这样的情况:在一个公司内部,同时进行这3个项目,而且以后随着这几个项目的结束,越来越多的项目会
开始;同时,公司内部建立一个Maven仓库。我们统一为所有这些项目配置该仓库,于是不得不为每个项目提供同样的配置。问题出现了,这是重复
!
其实我们可以做到只配置一次,在哪里配置呢?就是settings.xml。
不过事情没有那么简单,不是简单的将POM中的<repositories>及<pluginRepositories>元素复制到settings.xml中就可以,setting.xml不直接支持
这两个元素。但我们还是有一个并不复杂的解决方案,就是利用profile,如下:
-
<
settings
>
-
...
-
<
profiles
>
-
<
profile
>
-
<
id
>
dev
</
id
>
-
-
</
profile
>
-
</
profiles
>
-
<
activeProfiles
>
-
<
activeProfile
>
dev
</
activeProfile
>
-
</
activeProfiles
>
-
...
-
</
settings
>
这里我们定义一个id为dev的profile,将所有repositories以及pluginRepositories元素放到这个
profile中,然后,使用<activeProfiles>元素自动激活该profile。这样,你就不用再为每个POM重复配置仓库。
使用profile为settings.xml添加仓库提供了一种用户全局范围的仓库配置。
镜像
如果你的地理位置附近有一个速度更快的central镜像,或者你想覆盖central仓库配置,或者你想为所有POM使用唯一的一个远程仓库(这个远程仓库代理的所有必要的其它仓库),你可以使用settings.xml中的mirror配置。
以下的mirror配置用maven.net.cn覆盖了Maven自带的central:
-
<
settings
>
-
...
-
<
mirrors
>
-
<
mirror
>
-
<
id
>
maven-net-cn
</
id
>
-
<
name
>
Maven China Mirror
</
name
>
-
<
url
>
http://maven.net.cn/content/groups/public/
</
url
>
-
<
mirrorOf
>
central
</
mirrorOf
>
-
</
mirror
>
-
</
mirrors
>
-
...
-
</
settings
>
这里唯一需要解释的是<mirrorOf>,这里我们配置central的镜像,我们也可以配置一个所有仓库的镜像,以保证该镜像是Maven唯一使用的仓库:
-
<
settings
>
-
...
-
<
mirrors
>
-
<
mirror
>
-
<
id
>
my-org-repo
</
id
>
-
<
name
>
Repository in My Orgnization
</
name
>
-
<
url
>
http://192.168.1.100/maven2
</
url
>
-
<
mirrorOf
>
*
</
mirrorOf
>
-
</
mirror
>
-
</
mirrors
>
-
...
-
</
settings
>
关于更加高级的镜像配置,可以参考:http://maven.apache.org/guides/mini/guide-mirror-settings.html。
分发构件至远程仓库
mvn install
会将项目生成的构件安装到本地Maven仓库,mvn deploy
用来将项目生成的构件分发到远程Maven仓库。本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。
我们需要配置POM的distributionManagement来指定Maven分发构件的位置,如下:
-
<
project
>
-
...
-
<
distributionManagement
>
-
<
repository
>
-
<
id
>
nexus-releases
</
id
>
-
<
name
>
Nexus Release Repository
</
name
>
-
<
url
>
http://127.0.0.1:8080/nexus/content/repositories/releases/
</
url
>
-
</
repository
>
-
<
snapshotRepository
>
-
<
id
>
nexus-snapshots
</
id
>
-
<
name
>
Nexus Snapshot Repository
</
name
>
-
<
url
>
http://127.0.0.1:8080/nexus/content/repositories/snapshots/
</
url
>
-
</
snapshotRepository
>
-
</
distributionManagement
>
-
...
-
</
project
>
Maven区别对待release版本的构件和snapshot版本的构件,snapshot为开发过程中的版本,实时,但不稳定,release版本则比较稳定。Maven会根据你项目的版本来判断将构件分发到哪个仓库。
一般来说,分发构件到远程仓库需要认证,如果你没有配置任何认证信息,你往往会得到401错误。这个时候,如下在settings.xml中配置认证信息:
<settings>
...
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
...
</settings>
需要注意的是,settings.xml中server元素下id的值必须与POM中repository或snapshotRepository
下id的值完全一致。将认证信息放到settings下而非POM中,是因为POM往往是它人可见的,而settings.xml是本地的。
小结
本文介绍了Maven仓库,它是什么?本地仓库,远程仓库,中央仓库具体是指什么?并介绍了如何在POM中配置项目层次的仓库,在settings中配置用户层次的仓库,以及mirror。本文还介绍了如何安装构件到本地仓库,如何分发构件至仓库。
相关推荐
你不收藏,你连mven都搞不到。本地maven 依赖操作mvn install:install-file -Dfile=G:\kingbase8-8.2.0.jar -DgroupId=com.kingbase8 -DartifactId=kingbase8 -Dversion=8.2.0 -Dpackaging=jar 你本地就能用这个依赖...
Maven的本地仓库在这一过程中扮演着至关重要的角色。 **Maven本地仓库** Maven本地仓库是Maven在本机上存储所有已下载的依赖项的地方。每次你在Maven项目中引入一个新的库,Maven都会首先在本地仓库中查找该库。...
将本地jar包上传到maven仓库,刷新仓库后即可使用
自己搞的,赚点积分。下载的人,不会觉得亏。亏了私信我。 【前端框架】 基于bootstrap的AdminLte2.4 jquery1.9 layer弹窗组件 ztree KingEditor4.1 datatables.js ...Spring SpringMvc Mybatis 非maven版本 ...
在开发Web应用时,文件的上传和下载是常见的功能需求,尤其在用户交互频繁的系统中。本项目通过使用Maven构建工具,结合Spring MVC框架,实现了前端上传文件到服务器和从服务器下载文件的功能,并利用Logback日志...
"jfinal demo"这个项目标题,暗示我们这是一个用于演示或学习JFinal的实例,通常包含了一个完整的Web应用程序,展示如何使用JFinal进行开发。在这个项目中,我们可以期待看到JFinal的配置、路由设定、模型定义、控制...
**ZK前端框架** ZK是一款基于Java的轻量级前端框架,专为构建富客户端Web应用程序设计。它提供了一种声明式的方式来编写用户界面,使得开发者可以专注于业务逻辑而不是DOM操作。ZK框架的核心特性包括组件化、事件...
1. 在项目级build.gradle文件中,添加百度地图SDK的Maven仓库: ``` allprojects { repositories { ... maven { url 'https://api.bintray.com/maven/baidumapsdk/maven/' } } } ``` 2. 在app级build.gradle文件...
PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性和丰富的数据类型支持而受到广大开发者喜爱。在开发过程中,为了提高效率,通常会使用代码生成器来自动化创建数据库实体类和通用业务逻辑代码。...
mave里面用命令行清楚缓存文件.
maven项目里面pom文件所需的tools.java文件,百分之百管用,下载好直接复制到java安装目录下即可使用
Maven可执行罐子骨架 具有执行权限的简单的自可执行jar的骨架项目。 自定义可执行jar 编辑pom.xml文件以添加依赖项并自定义内部版本和应用程序名称。 将资源和资源添加到sur src/main/java目录中。...
APP管理,可以审核软件和下载软件,使用SSM+mven写入 <groupId>org.mybatis <artifactId>mybatis <version>3.2.2 <groupId>org.mybatis <artifactId>mybatis-spring <version>1.2.0 ...
声纳质量门Maven插件 检查您的SonarQube项目是否通过质量检验。 如果没有,插件将使Maven作业失败。 支持三种模式: 模式描述集成(推荐) 与sonar-maven-plugin结合运行(支持分支和请求请求) 用于获取数据所需要...
mysql数据库,mven,css, 2. 小组分工说明 无 3. 功能展示 首页: 首页是图书馆的登录页面。 二级页面: (图为‘借阅管理’页面) (图为‘图书管理’页面) (图为‘读者管理’页面) (图为‘管理员管理’...
Maven 管理 Spring Boot Profile 详解 Maven 管理 Spring Boot Profile 是一个重要的知识点,它可以帮助开发者更好地管理 Spring Boot 项目中的配置文件和依赖关系。在本文中,我们将详细探讨 Maven 管理 Spring ...
Old Posts在 :seedling: 我目前正在学习Kubernetes,DevOps,软件架构 :blue_book: 我的复习书籍是进行的| | :video_game: 我为自己的Jenkins,SeleniumRC,Plex Server,PiHole,OpenVPN,DockerHub,Mven Repo,...
《Java媒体工具包(JAI)详解》 Java Media Framework (JMF) 和 Java Advanced Imaging (JAI) 是Java平台上处理多媒体数据的核心组件。本文将深入探讨JAI,特别是其核心库`javax.media.jai.jar`,以及与之相关的`...
使用MVEN堆栈构建的SPA 快速开始 # Install Server Dependencies npm install # Start Express Server: http://localhost:5000 npm run dev # Install Frontend Dependencies cd client npm install # Start Vue Dev...
- 配置PATH变量,Windows系统需要在Path变量的值中添加%MVEN_HOME%\bin,并用分号与其它路径值隔开。Linux和Mac系统则是在PATH变量值后面添加${MAVEN_HOME}/bin。 5. 验证安装:配置好环境变量后,打开命令行界面...