日期:2014-05-20  浏览次数:20603 次

【探讨学习为主,欢迎都来看看】谁对maven比较熟,帮忙解我的惑,关于mirror的,欢迎都进来讨论一下
maven有个配置文件叫settings.xml,里面有配置mirror的

我目前用的版本还是2.0.9

有个默认的central的site地址为http://repo1.maven.org/maven2
默认会从这个以上站点下载artifact
(可以把你settings配置文件里面注释掉mirrorOf为central的,然后maven去build一下,看下日志就知道默认是从哪下的了)

你可以在你的配置文件里面改成其他的,但貌似不能配置多个central,以最后定义的那个为准
也就是说,定义了多个central的mirror,实际还是会从最后一个去下载artifact

至于mirrorOf这个属性不是central的情况,是针对具体的project里面pom文件定义的repository来的

也就是说,mirrorOf为central,是替换官方默认的http://repo1.maven.org/maven2
mirrorOf为其他的,是替换pom文件里的reporitory

比如pom.xml定义了以下
XML code
<repositories>
        <repository>
            <id>abc</id>
            <name>xxx</name>
            <url>
                http://a/b/c
            </url>
        </repository>
    </repositories>



settings.xml
定义了如下
XML code
<mirrors>
    <mirror>
        <id>d</id><!-- mirror自己的id,貌似不是很重要 -->
        <mirrorOf>abc</mirrorOf><!-- 作为以上pom.xml文件定义的repository的一个mirror -->
        <url>http://someserver/repository</url>
    </mirror>

  </mirrors>


以上的例子,假设只定义了这么一个mirror以及reporisoty, build的时候只会从两个site去download,一个是默认的central,一个是abc的mirror,url为http://someserver/repository


我估计很多朋友碰到过配置了多个mirror,而且明明有artifact在上面,但maven在build的时候就是不会正确找到而报错


实际上,很多的mirror是不会左右有效的site的,有以下两种情况
1, 配置了多个mirrorOf相同的mirror,只会从最后一个去下载,如果最后的那个artifact刚好是不全的, maven也不会很智能的去其他site找
2, mirror没有对应的repository
比如你在pom文件里定义了一个repository,id为abc,但在settings配置文件里面并没有一个mirror,它的mirrorOf为abc,那么这个mirror也不会被采用


以上是我这两天测试的结果,可能有说得不对的地方,尽可以指出
而我的疑问主要是:
mirror配置在全局的settings文件里面,却需要为某个具体的project的pom文件而改变
比如在project A的pom文件里定义了一个id为abc的repository,那么settings文件就需要一个mirrorOf为abc的mirror
如果在project B的pom又有一个id为def的repository,那么settings就需要新增一个mirrorOf为def的mirror
感觉全局的配置文件却受一个具体的pom文件所影响,会不会觉得有点反过来了呢?在这一点上并没有起到全局的意义


或者可以这样理解
你在settings文件里定义一个mirror,指定mirrorOf的属性为xxxx
那么你在创建一个具体的project的pom文件的时候,如果想用那个mirror,就必须指定id为xxxx
不论是对project A还是project B



此贴主要是探讨,之前对mirror这个很是不解,欢迎各位拍砖。。。

------解决方案--------------------
1 之前发现Maven很不好用,也知道是国内网络问题,后来终于下决心用nexus装了个私服,遂OK。
2 不认为pom中应该定义repository的,pom应该关心group id和artifact id,只要这两者确定,artifact就应该是唯一确定的,无论从哪个repository下。个人理解。

------解决方案--------------------
探讨
pom不定义repository的话,怎样从多个site去下载artifact呢?

可能有一些customized的artifact是需要从内部服务器或者其他的site上下过来的呢?

------解决方案--------------------
探讨

我的理解:
settings才是“局部”的——只对你一个人
pom才是“全局”的——针对全世界成千上万开发者


------解决方案--------------------
探讨
1, 配置了多个mirrorOf相同的mirror,只会从最后一个去下载,如果最后的那个artifact刚好是不全的, maven也不会很智能的去其他site找

------解决方案--------------------
探讨

引用:

引用:
1, 配置了多个mirrorOf相同的mirror,只会从最后一个去下载,如果最后的那个artifact刚好是不全的, maven也不会很智能的去其他site找

昨天搜了下资料,已经可以确定,mirror一旦设置,原Server将不再被使用。所以,如果多个site想互相补充,不能设成mirror方式。……

------解决方案--------------------
探讨

同意。
我觉得只能在pom文件里面设置多个repository来达到互补的目的