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这个很是不解,欢迎各位拍砖
默认会从这个以上站点下载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这个很是不解,欢迎各位拍砖
2 不认为pom中应该定义repository的,pom应该关心group id和artifact id,只要这两者确定,artifact就应该是唯一确定的,无论从哪个repository下。个人理解。
pom不定义repository的话,怎样从多个site去下载artifact呢?
默认的话只是从一个central site去下载
可能有一些customized的artifact是需要从内部服务器或者其他的site上下过来的呢?
内部服务器和不知名的site,我是配置到私服中去,不在Maven这个环节上捣鼓了,感觉Maven有点问题,未查证。
其次,pom并不是为你这个一个工程服务的,它还会被其他所有引用的包(儿子、孙子、重孙...)引用。比如我经常用的commons-lang,可能他们的开发人员会设置自己的镜像mirrorX,难道要把这个镜像也加入commons-lang/pom.xml,继而被无数个maven工程引用、访问?
settings才是“局部”的——只对你一个人
pom才是“全局”的——针对全世界成千上万开发者当然,这个和lz的角度完全不同,lz是针对一个用户开发不同的pom.xml,而我的角度是,全球用户使用dependency
如果调整一下词汇,可以说,pom是“逻辑”的,settings是“物理”的。
我觉得只能在pom文件里面设置多个repository来达到互补的目的老兄觉得呢?
或者在私服中配...
私服中又该怎么配呢?
<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(代理)
这个我怎么觉得你的这个mirror会作为唯一的repository
不能达到互补吧?
多个repo的互补是在Nexus组中完成的。
这是一种跳跃,将pom从物理束缚中解放出来,它要的所有的artifact都从唯一的一个public组中去要。而你的私服完成对所有相关库的合并。