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定义了以下
<repositories>
<repository>
<id>abc</id>
<name>xxx</name>
<url>
http://a/b/c
</url>
</repository>
</repositories>
settings.xml
定义了如下
<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.   

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

  2.   


    pom不定义repository的话,怎样从多个site去下载artifact呢?
    默认的话只是从一个central site去下载
    可能有一些customized的artifact是需要从内部服务器或者其他的site上下过来的呢?
      

  3.   

    如果配了镜像,应该是从任意一个site下载吧。而且感觉好像是任意一个site的索引先查过了没东西,基本就会认定这个东西不存在。根据mirror的语义,这么规定应该也是合理的。
    内部服务器和不知名的site,我是配置到私服中去,不在Maven这个环节上捣鼓了,感觉Maven有点问题,未查证。
      

  4.   

    我认为,当然应当在settings里面设置。首先,真正的全局镜像设置(“镜像”可能不准确),应当是central或者某个repo自己做的集群或者CDN。central的服务器可以有N个,但url只能有一个:http://repo1.maven.org/maven2。
    其次,pom并不是为你这个一个工程服务的,它还会被其他所有引用的包(儿子、孙子、重孙...)引用。比如我经常用的commons-lang,可能他们的开发人员会设置自己的镜像mirrorX,难道要把这个镜像也加入commons-lang/pom.xml,继而被无数个maven工程引用、访问?
      

  5.   

    同样以我举的commons-lang为例子,假设commons-lang依赖commons-core,而这个并没有被Central收录,如果不配置在commons-lang/pom.xml的话,那么全世界的程序员必须手工配置repo,才能使用commons-lang嘛
      

  6.   

    我看了下,如果说pom.xml是针对某个项目,诚然,但它的repository id却必须是全局唯一,否则在settings.xml中的mirrorofXXX就不能唯一定位到这个repository,所以从这个意义上讲pom.xml是不是也带有点全局的意味了呢 而所谓settings.xml中的mirror只是一个备全的方案,防止单薄的repository失效,增加了系统的健壮性,从楼主的表述看,貌似必须要为repository配置一个mirror,仿佛全局反受局部控制,我不知道具体maven是怎么样设定的,我个人认为mirror可以不强制配置,否则不够灵活。p.s. 我对maven了解不多
      

  7.   

    我的理解:
    settings才是“局部”的——只对你一个人
    pom才是“全局”的——针对全世界成千上万开发者当然,这个和lz的角度完全不同,lz是针对一个用户开发不同的pom.xml,而我的角度是,全球用户使用dependency
      

  8.   

    赞同这个说法。
    如果调整一下词汇,可以说,pom是“逻辑”的,settings是“物理”的。
      

  9.   

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

  10.   

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

  11.   

    正常情况下是这样。不过,还有一个非通用的方法,适用于传统开发,即:使用eclipse插件之类的辅助方法。其实,也就是自动向mvn命令行增加-D参数来定制remote repo的。
      

  12.   

    或者在settings.xml文件中加,
    或者在私服中配...
      

  13.   

    settings.xml文件中怎么加?
    私服中又该怎么配呢?
      

  14.   

    在本机使用Nexus私服的时候,settings.xml中可以这么配
    <mirrors>
    <mirror>
    <id>nexus</id>
    <mirrorOf>*</mirrorOf>
    <url>http://localhost/nexus/content/groups/public</url>
    </mirror>
    </mirrors>
    <profiles>
    <profile>
    <id>nexus</id>
    <repositories>
    <repository>
    <id>central</id>
    <url>http://central</url>
    <releases>
    <enabled>true</enabled>
    </releases>
    <snapshots>
    <enabled>true</enabled>
    </snapshots>
    </repository>
    </repositories>
    <pluginRepositories>
    <pluginRepository>
    <id>central</id>
    <url>http://central</url>
    <releases>
    <enabled>true</enabled>
    </releases>
    <snapshots>
    <enabled>true</enabled>
    </snapshots>
    </pluginRepository>
    </pluginRepositories>
    </profile>
    </profiles>
    <activeProfiles>
    <activeProfile>nexus</activeProfile>
    </activeProfiles>至于Nexus中,是将Repository分组,通常所有公司外部资源可以定义到public组中,组中放多个Repository(代理)
      

  15.   

    <mirrorOf>*</mirrorOf>
    这个我怎么觉得你的这个mirror会作为唯一的repository
    不能达到互补吧?
      

  16.   

    是的,唯一的源。
    多个repo的互补是在Nexus组中完成的。
    这是一种跳跃,将pom从物理束缚中解放出来,它要的所有的artifact都从唯一的一个public组中去要。而你的私服完成对所有相关库的合并。