maven <repositories>标签和<pluginRepositories>标签的使用

在不用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)。

本地仓库(.m2) 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 :

 <!-- localRepository
 | The path to the local repository maven will use to store artifacts.
 |
 | Default: ${user.home}/.m2/repository-->
 <localRepository>D:/.m2/repository</localRepository>

还可以在运行时指定本地仓库位置:

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 ,

但是到了3.xxx版本之后在: maven安装目录下的:/lib/maven-model-builder-${version}.jar中

打开该文件,能找到超级POM:\org\apache\maven\model\pom-4.0.0.xml ,它是所有Maven POM的父POM,所有Maven项目继承该配置,你可以在这个POM中发现如下配置:

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

关于远程仓库的配置,下面的我会详细解释,这里我们只要知道,中央仓库的id为central,远程url地址为http://repo.maven.apache.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>
  <!-- repositories and pluginRepositories here-->
 </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唯一使用的仓库:

 <mirrors>
 <!-- mirror
  | Specifies a repository mirror site to use instead of a given repository. The repository that
  | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
  | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
  |
  -->
 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <name>Nexus Mirror</name>
  <url>http://xx.xx/nexus/content/groups/public</url>
 </mirror>
 </mirrors>
<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>

到此这篇关于maven <repositories>标签和<pluginRepositories>标签的使用的文章就介绍到这了,更多相关maven <repositories>和<pluginRepositories>标签内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决IDEA中Maven项目中JSTL标签无效问题

    代码如下(忽略编译错误,不影响结果) 最近刚换IDEA用上Maven,之前一直都是用Eclipse.这回踩了个坑,所以跟大家分享一下. 当我准备在IDEA上用Maven创建SSM项目的时候,我发现页面的JSTL标签不生效,EL标签和导入的C标签会直接被输出. 例如上图最后页面显示的是${name},并没有输出我定义的"呵呵",在pom.xml文件中有jstl的依赖包,但死活不生效. 尝试了很多方法,网上找了很多资料,想起之前用IDEA创建普通web项目的时候,导入C标签会报错,需要手动

  • maven <repositories>标签和<pluginRepositories>标签的使用

    在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等.每建立一个项目,你都需要建立这样的一个/lib目录,然后复制一对jar文件,这是很明显的重复.重复永远是噩梦的起点,多个项目不共用相同的jar文件,不仅会造成磁盘资源的浪费,也使得版本的一致性管理变得困难.此外,如果你使用版本管理工具,如SVN(你没有使用版本管理工具?马上试试SVN吧,它能帮你解决很多头疼的问

  • ThinkPHP模板范围判断输出In标签与Range标签用法详解

    ThinkPHP模板的in标签与range标签用于判断某个模板变量是否在某个范围之内. 1.in标签 ThinkPHP的in标签用于某个模板变量是否在某个范围之内,使用格式如下: <in name="变量名" value="值1,值2,...">要输出的内容</in> 使用时,在模块操作(如 Index/display )里设定变量并赋值给模板: $groupId = 1; $this->assign( "groupId&qu

  • PHP正则删除html代码中a标签并保留标签内容的方法 原创

    本文实例讲述了PHP正则删除html代码中a标签并保留标签内容的方法.分享给大家供大家参考,具体如下: 一.问题: 有HTML代码如: <div>欢迎访问我们<a href=http://www.jb51.net>www.jb51.net</a></div> 要求正则删除a标签,同时保留a标签内容,如下: <div>欢迎访问我们www.jb51.net</div> 二.解决方法: $str = "<div>欢迎访

  • chrome下判断点击input上标签还是其余标签的实现方法

    想要实现的功能:当input框失焦且点击的不是清除键时,执行reset方法重置input样式,当点击清除键时,执行clear方法,清除input内容. 如图 本想通过如下代码来实现 $(".search-input").focusout(function () { if (document.activeElement.className !== 'close-t') {//close-t为清除键类名 $('.search-input').addClass('search-before'

  • Vue.js做select下拉列表的实例(ul-li标签仿select标签)

    目标:用ul-li标签结合Vue.js知识做一个模仿select标签的下拉选项列表. 知识点: 组件的写法及运用 组件之间的数据传递(props的运用) 组件之间的数据传递($emit的运用) 动态数据的绑定(v-bind) 自定义事件通信 效果图: 1.未做任何操作前,下拉列表为隐藏状态 2.点击输入框显示下拉列表 3. 点击列表项,输入框值跟随改变 PS: 为了演示data1, data2两组数据的绑定,实例中创建了两个列表 html代码: <!DOCTYPE html> <html

  • Mybatis中typeAliases标签和package标签使用

    目录 typeAliases标签和package标签的使用 1.typeAliases 2.package properties,typeAliases,package三个标签使用以及细节 typeAliases标签和package标签的使用 1.typeAliases 主配置文件: <typeAliases> <typeAlias type="com.itheima.domain.User" alias="user"></typeAl

  • Mybatis中resultMap标签和sql标签的设置方式

    目录 resultMap标签和sql标签的设置 1.项目目录 2.数据库中的表的信息 3.配置文件的信息 4.User类 5.IUserDao接口 6.MybatisTest 7.运行结果 resultMap标签的使用规则 自定义结果映射规则 association联合查询 使用association进行分布查询 collection分步查询 resultMap标签和sql标签的设置 1.项目目录 2.数据库中的表的信息 3.配置文件的信息 1.SqlMapConfig.xml文件 <?xml

  • Java的Struts框架中append标签与generator标签的使用

    append 标签: 这些append标签需要两个或两个以上的列表作为参数,并追加它们放在一起,如下图所示: <s:append var="myAppendIterator"> <s:param value="%{myList1}" /> <s:param value="%{myList2}" /> <s:param value="%{myList3}" /> </s:ap

  • jsp base标签与meta标签学习小结

    复制代码 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!-- 定义jsp的编码,还有引入的java文件 --> <% String path = request.getContextPath(); //得到当前的项目名字. String basePath = request.getScheme()+"

  • jquery删除指定的html标签并保留标签内文本内容的方法

    例如有这样一段html代码: 复制代码 代码如下: 我们演示代码  <p>大家好,欢迎来到jb51.net</p>  这里为大家提供最优秀的<a href="http://www.jb51.net/js">js</a>代码和教程 我们希望删除这段html代码里面的一对<p>标签,但是要保持里面的内容不被删除,这里我们用jquery处理,详细的jQuery代码: 复制代码 代码如下: <script type="

随机推荐