【探讨学习为主,欢迎都来看看】谁对maven比较熟,帮忙解我的惑,关于mirror的,欢迎都进来讨论一下

believefym 2011-04-22 12:06:35
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这个很是不解,欢迎各位拍砖。。。
...全文
433 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
rlplyyrb 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 magong 的回复:]

引用 16 楼 believefym 的回复:
<mirrorOf>*</mirrorOf>
这个我怎么觉得你的这个mirror会作为唯一的repository
不能达到互补吧?

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

正解,和我想法一样!
cherry 2011-09-21
  • 打赏
  • 举报
回复
学习学习
magong 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 believefym 的回复:]
<mirrorOf>*</mirrorOf>
这个我怎么觉得你的这个mirror会作为唯一的repository
不能达到互补吧?
[/Quote]
是的,唯一的源。
多个repo的互补是在Nexus组中完成的。
这是一种跳跃,将pom从物理束缚中解放出来,它要的所有的artifact都从唯一的一个public组中去要。而你的私服完成对所有相关库的合并。
believefym 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 magong 的回复:]
    <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>

[/Quote]


<mirrorOf>*</mirrorOf>
这个我怎么觉得你的这个mirror会作为唯一的repository
不能达到互补吧?
believefym 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 magong 的回复:]

引用 11 楼 believefym 的回复:

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

老兄觉得呢?

或者在settings.xml文件中加,
或者在私服中配...
[/Quote]


settings.xml文件中怎么加?
私服中又该怎么配呢?
magong 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 believefym 的回复:]

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

老兄觉得呢?
[/Quote]
或者在settings.xml文件中加,
或者在私服中配...
shine333 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 believefym 的回复:]

引用 10 楼 magong 的回复:

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

昨天搜了下资料,已经可以确定,mirror一旦设置,原Server将不再被使用。所以,如果多个site想互相补充,不能设成mirror方式。……
[/Quote]
正常情况下是这样。不过,还有一个非通用的方法,适用于传统开发,即:使用eclipse插件之类的辅助方法。其实,也就是自动向mvn命令行增加-D参数来定制remote repo的。
believefym 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 magong 的回复:]

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

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


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

老兄觉得呢?
magong 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 believefym 的回复:]
1, 配置了多个mirrorOf相同的mirror,只会从最后一个去下载,如果最后的那个artifact刚好是不全的, maven也不会很智能的去其他site找
[/Quote]
昨天搜了下资料,已经可以确定,mirror一旦设置,原Server将不再被使用。所以,如果多个site想互相补充,不能设成mirror方式。
magong 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 believefym 的回复:]

settings.xml文件中怎么加?
私服中又该怎么配呢?
[/Quote]
在本机使用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(代理)
believefym 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shine333 的回复:]

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

当然,这个和lz的角度完全不同,lz是针对一个用户开发不同的pom.xml,而我的角度是,全球用户使用dependency
[/Quote]

仔细一想,很有道理。。。
magong 2011-04-22
  • 打赏
  • 举报
回复
1 之前发现Maven很不好用,也知道是国内网络问题,后来终于下决心用nexus装了个私服,遂OK。
2 不认为pom中应该定义repository的,pom应该关心group id和artifact id,只要这两者确定,artifact就应该是唯一确定的,无论从哪个repository下。个人理解。
magong 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shine333 的回复:]

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

[/Quote]
赞同这个说法。
如果调整一下词汇,可以说,pom是“逻辑”的,settings是“物理”的。
shine333 2011-04-22
  • 打赏
  • 举报
回复
我的理解:
settings才是“局部”的——只对你一个人
pom才是“全局”的——针对全世界成千上万开发者

当然,这个和lz的角度完全不同,lz是针对一个用户开发不同的pom.xml,而我的角度是,全球用户使用dependency
dracularking 2011-04-22
  • 打赏
  • 举报
回复
我看了下,如果说pom.xml是针对某个项目,诚然,但它的repository id却必须是全局唯一,否则在settings.xml中的mirrorofXXX就不能唯一定位到这个repository,所以从这个意义上讲pom.xml是不是也带有点全局的意味了呢

而所谓settings.xml中的mirror只是一个备全的方案,防止单薄的repository失效,增加了系统的健壮性,从楼主的表述看,貌似必须要为repository配置一个mirror,仿佛全局反受局部控制,我不知道具体maven是怎么样设定的,我个人认为mirror可以不强制配置,否则不够灵活。

p.s. 我对maven了解不多
shine333 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 magong 的回复:]

2 不认为pom中应该定义repository的,pom应该关心group id和artifact id,只要这两者确定,artifact就应该是唯一确定的,无论从哪个repository下。个人理解。
[/Quote]
同样以我举的commons-lang为例子,假设commons-lang依赖commons-core,而这个并没有被Central收录,如果不配置在commons-lang/pom.xml的话,那么全世界的程序员必须手工配置repo,才能使用commons-lang嘛
shine333 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 believefym 的回复:]
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文件所影响,会不会觉得有点反过来了呢?在这一点上并没有起到全局的意义
[/Quote]
我认为,当然应当在settings里面设置。首先,真正的全局镜像设置(“镜像”可能不准确),应当是central或者某个repo自己做的集群或者CDN。central的服务器可以有N个,但url只能有一个:http://repo1.maven.org/maven2。
其次,pom并不是为你这个一个工程服务的,它还会被其他所有引用的包(儿子、孙子、重孙...)引用。比如我经常用的commons-lang,可能他们的开发人员会设置自己的镜像mirrorX,难道要把这个镜像也加入commons-lang/pom.xml,继而被无数个maven工程引用、访问?
magong 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 believefym 的回复:]
pom不定义repository的话,怎样从多个site去下载artifact呢?

可能有一些customized的artifact是需要从内部服务器或者其他的site上下过来的呢?
[/Quote]
如果配了镜像,应该是从任意一个site下载吧。而且感觉好像是任意一个site的索引先查过了没东西,基本就会认定这个东西不存在。根据mirror的语义,这么规定应该也是合理的。
内部服务器和不知名的site,我是配置到私服中去,不在Maven这个环节上捣鼓了,感觉Maven有点问题,未查证。
believefym 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 magong 的回复:]

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

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

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧