【问题标题】:How does maven 3 determine if a snapshot is updated?maven 3如何判断快照是否更新?
【发布时间】:2012-06-11 05:43:49
【问题描述】:

我们在内部托管了一个简单的 maven 存储库,但 maven 似乎没有从中获取新的快照版本。我们的本地 maven 存储库在 settings.xml 中配置:

<snapshots>
    <enabled>true</enabled>
    <updatePolicy>always</updatePolicy>
</snapshots>

将它与“mvn -U”之类的内容结合起来,我希望 maven 能够获取最新的快照版本(如果适用)。据我所知,maven 将检查 metadata.xml 的最后修改,并据此确定快照是否已更新。但是,我并不完全清楚上次更新的是哪个。以如下 metadata.xml 为例:

<metadata>
<groupId>com.example</groupId>
<artifactId>example-test</artifactId>
<version>1.0-SNAPSHOT</version>
<versioning>
    <versions>
        <version>1.0-SNAPSHOT</version>
    </versions>
    <snapshot>
        <timestamp>20120427.113221</timestamp>
        <buildNumber>1335519141810</buildNumber>
    </snapshot>
    <lastUpdated>20120427113221</lastUpdated>
</versioning>

maven 是否使用 lastUpdated 标签? “最后修改”的 http 标头? snapshot.timestamp 标签还是别的什么东西?

无论如何,我们看到的行为是它确实会下载最新的 metadata.xml,但会停在那里,它不会重新下载快照本身。

编辑:我注意到在 maven 2 中可选的独特快照功能在 maven 3 中已成为必需。maven 是否可能根本没有检测到更新版本?现在从模块中查看 maven-metadata.xml:

<metadata modelVersion="1.1.0">
<groupId>com.example</groupId>
<artifactId>example-test</artifactId>
<version>1.0-SNAPSHOT</version>
<versioning>
    <snapshot>
        <timestamp>20120607.154257</timestamp>
        <buildNumber>1339076577</buildNumber>
    </snapshot>
    <lastUpdated>20120607154257</lastUpdated>
    <snapshotVersions>
        <snapshotVersion>
            <extension>jar</extension>
            <value>1.0-20120607.154257-1339076577</value>
            <updated>20120607154257</updated>
        </snapshotVersion>
    </snapshotVersions>
</versioning>

maven 会检查内部版本号吗? snapshotVersion 的“更新”标签?

【问题讨论】:

    标签: java maven maven-metadata


    【解决方案1】:

    如果您在本地处理模块并已运行:

    mvn clean install

    这将在您的本地 Maven 存储库中安装一个副本。该工件将处于锁定状态——这意味着——除非元数据*xml 已被删除,否则它不会从远程位置更新。

    如果你在几天内完成了这个模块的工作并开始处理其他模块,这又取决于这个初始模块,因为它不会选择从您的远程存储库中更新更改。

    已为此here 提交了一个错误。但是,它不太可能很快得到修复。因此,有必要了解这种行为。

    【讨论】:

    • 抱歉回复晚了。我没有在本地安装模块,但从另一个项目来看,我认为“maven-metadata-local.xml”在锁定中很重要?无论如何,我已经删除了我的 maven repo 中的文件夹并重现了问题:第一个 maven 操作下载了 jar,我更新了 repo 上的 jar(不是从我自己的系统推送的新版本)并在我的系统上运行另一个 maven 命令。结果是只更新了元数据文件。
    • 它已修复,但讽刺的是它现在不会锁定:即使您执行本地安装,它也会尝试从 repo 获取最新版本。我现在可以忍受。
    【解决方案2】:

    最后,问题出在 metadata.xml 上。如果像原始请求中提到的那样由我们的服务器生成模型 1.1.0,maven 将只更新元数据。通过切换回旧的“1.0.0”模型,它可以工作。示例 metadata.xml:

    <metadata modelVersion="1.0.0">
    <groupId>com.example</groupId>
    <artifactId>example-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <versioning>
        <snapshot>
            <timestamp>20120608.103301</timestamp>
            <buildNumber>1339144381</buildNumber>
        </snapshot>
        <lastUpdated>20120608103301</lastUpdated>
    </versioning>
    

    目前还不清楚有问题的 1.1.0 metadata.xml 是 maven 还是我们的 repo 中的错误,但至少我们可以继续工作。

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2014-11-16
      相关资源
      最近更新 更多