Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven从不同的存储库下载两个相同的jar时,如何选择使用哪个.jar_Java_Maven_Jar_Dependency Management_Nexus - Fatal编程技术网

Java Maven从不同的存储库下载两个相同的jar时,如何选择使用哪个.jar

Java Maven从不同的存储库下载两个相同的jar时,如何选择使用哪个.jar,java,maven,jar,dependency-management,nexus,Java,Maven,Jar,Dependency Management,Nexus,抱歉,描述太长: 背景:我有两个项目,比方说A和B。内置项目A部署到Nexus Repository Manager OSS 2.12.0 repo A,内置项目B部署到Nexus repo B。我的maven项目需要使用repo A和repo B中的.jar 因此,我将maven.settings文件配置为使用2个不同的Nexus存储库(具有2个镜像) 现在,我看到当我编译我的maven项目时,它将通过repoA,搜索jar,然后通过repoB,搜索jar。当它找到jar时,它将下载它 问题:

抱歉,描述太长:

背景:我有两个项目,比方说A和B。内置项目A部署到Nexus Repository Manager OSS 2.12.0 repo A,内置项目B部署到Nexus repo B。我的maven项目需要使用repo A和repo B中的.jar

因此,我将maven.settings文件配置为使用2个不同的Nexus存储库(具有2个镜像)

现在,我看到当我编译我的maven项目时,它将通过repoA,搜索jar,然后通过repoB,搜索jar。当它找到jar时,它将下载它

问题:我曾经对项目A和项目B的JAR使用回购B(回购的所有者把我踢了出去)。因此,我现在在repo a和repo B中都有相同的组件0.0.1快照

Maven现在在编译期间下载这两个快照


问题:如果两个.jar名称相同(例如:componentName-0.0.1-SNAPSHOT),maven如何解析使用哪个.jar?我在本地的./m2存储库中看到了一个解析器状态文件,但我不确定它是如何在两个jar之间解析的。理想情况下,我希望maven使用最新更新(基于时间戳)的jar

简短回答:在maven计算的有效POM中,哪个存储库位于第一位。(您可以通过运行
mvn帮助:effective pom
查看您的有效pom)

长答案:

maven解析快照工件的方式(大致)如下:

1) 查看

2) 浏览
中列出的所有存储库

3) 对于每个快照存储库,检查是否存在该依赖项的组、包名称和版本的文件

例如,给定包坐标:
io.packagecloud:jake:4.0-SNAPSHOT
,它将在每个配置的存储库中查找
/io/packagecloud/jake/4.0-SNAPSHOT/maven metadata.xml

4) 如果找到此文件,则使用它查找要加载的最新工件。请看一个示例
maven metadata.xml

$ curl -L https://packagecloud.io/capotej/snapshot_example/maven2/io/packagecloud/jake/4.0-SNAPSHOT/maven-metadata.xml

<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0">
  <groupId>io.packagecloud</groupId>
  <artifactId>jake</artifactId>
  <version>4.0-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20161003.234325</timestamp>
      <buildNumber>2</buildNumber>
    </snapshot>
    <lastUpdated>20161003234325</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>jar</extension>
        <value>4.0-20161003.234325-2</value>
        <updated>20161003234325</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>4.0-20161003.234325-2</value>
        <updated>20161003234325</updated>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>
希望这能回答你的问题

相关的:


您不应该使用修订时间戳作为选择JAR的主要方法;改为使用版本号。可能只是增加版本,例如,
componentName-0.0.2-SNAPSHOT
如果Nexus有1个托管存储库和2个代理存储库,其中包含相同的jar,那么可能会重复相同的版本号吗?如果代理A恰好在库X上有一个比代理B和托管REPO更新的lastUpdated戳记,则将选择该戳记?
合并每个已检查元数据文件的版本,以查找最新版本(基于元数据的时间戳)。
curl -I https://packagecloud.io/capotej/snapshot_example/maven2/io/packagecloud/jake/4.0-SNAPSHOT/jake-4.0-20161003.234325-2.jar