ChatGPT解决这个技术问题 Extra ChatGPT

当 maven 说“在 MyRepo 的更新间隔过去之前不会重新尝试解析”时,该间隔在哪里指定?

使用 maven,我偶尔会遇到一个来自我尚未构建或包含在我的存储库中的一些 3rd 方存储库的工件。

我会从 maven 客户端收到一条错误消息,说找不到工件:

http://myrepo:80/artifactory/repo 中找不到 org.jfrog.maven.annomojo:maven-plugin-anno:jar:1.4.0 失败缓存在本地仓库中,直到更新间隔才会重新尝试解析MyRepo 已过期或强制更新 -> [帮助 1]

现在,明白这意味着什么,可以简单地使用 -U 重新运行我的命令,并且从此以后一切正常

但是,我发现此错误消息非常不直观,并试图让我的同事免于头疼。

我想弄清楚是否有可以修改此 update interval 设置的地方。

此错误消息中提到的更新间隔是客户端设置还是服务器端设置?如果是客户端,我该如何配置?如果是服务器端,是否有人知道 Nexus/Artifactory 如何/是否公开这些设置?

在我的 pom.xml 添加了 1 个依赖项后,我收到了相同的错误消息。对我来说,这显然是一个 BUG。我不明白为什么会这样!如果我将依赖项添加到我的项目并运行 mvn compile ,那么它应该只下载 jar 文件。这种行为完全是胡说八道!
我最近刚刚经历了这一点,在我阅读了所有答案之后,另一个额外的步骤是在 Eclipse 中重新导入项目(在我的例子中)。 Eclipse 一直在用不在我的 pom.xml 中的插件来骚扰我,这太奇怪了。
对我来说一个重要的问题!!谢谢哥们!
对我来说,结果是一个特定的 repo 链接到 GitHub 并且 url 离线(得到 404)。我将存储库更新到我们的内部服务器并且它工作正常。

P
Peter Hall

我曾经通过删除本地 repo 中相应的无法下载工件目录来解决此问题。下次我运行 maven 命令时,会再次触发工件下载。因此,我会说这是客户端设置。

Nexus 端(服务器 repo 端),配置计划任务解决了这个问题。正如您已经指出的,客户端,这是使用 -U 完成的。


“我用来解决这个问题,方法是在我的本地 repo 中删除相应的下载失败的工件目录。”这对我有用。我也在使用 Netbeans。
如果 Maven 注意到缓存的工件无效,为什么它不能自己解决这个问题?
“配置计划任务”和“这是使用 -U 完成的”是什么意思,您能否将它们放入客观的 Eclipse UI 术语中?
我假设您的意思是 Eclipse IDE。理论上你需要下载最新的 SNAPSHOT。为此,您需要在 maven 命令中添加“-U”参数,例如 mvn clean compile -U。现在,您可以通过命令行或 Eclipse 通过勾选“始终更新快照”框来运行此 maven 命令。不确定,这些天我使用intellij。 “配置计划任务”部分是指您希望在 Nexus 服务器上进行的特定配置。后者与 Eclipse 本身无关。
这并不能回答 OP 的实际问题。
S
Sanjeev Guglani

基本上发生的是,根据 maven 的默认 updatePolicy。Maven 将每天从 repo 中获取 jars。因此,如果在第一次尝试期间您的互联网无法正常工作,那么它不会尝试再次获取这个 jar,直到花费 24 小时。

解析度 :

要么使用

mvn -U clean install

其中 -U 将强制更新 repo

或使用

<profiles>
    <profile>
      ...
      <repositories>
        <repository>
          <id>myRepo</id>
          <name>My Repository</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
         </repository>
      </repositories>
      ...
    </profile>
  </profiles>

在你的 settings.xml


这实际上帮助我解决了系统范围的依赖关系,避免了运行时的 NoClassDefFoundError
由于某种原因,清理 .m2 对我不起作用,在 settings.xml 文件中添加 updatePolicy 标记后,下载了工件
k
kds

您可以删除本地存储库中相应的失败工件目录。您也可以简单地在目标中使用 -U。它会完成这项工作。这适用于 maven 3。因此无需降级到 maven 2。


既然存储库配置如此简单,为什么还要搞乱它?
请在回答之前仔细阅读问题。 OP 询问如何设置时间间隔,而不是如何强制更新。
不是问题的答案,但这是人们遇到此异常时所需要的。因为当您进行本地库开发时,最好是删除这样的库,而不是让间隔混淆您。
我们应该在 ~/.m2/settings.xml/<repositories> 下添加有效的存储库,以使用 -U 选项解决此问题
P
Peter Hall

我有一个相关的问题,但 Raghuram 的回答有帮助。 (我还没有足够的声誉来投票支持他的答案)。我正在使用与 NetBeans 捆绑在一起的 Maven,并且得到相同的“...已缓存在本地存储库中,直到 nexus 的更新间隔已过或强制更新 -> [Help 1]”错误才会重新尝试解析.

为了解决这个问题,我将 <updatePolicy>always</updatePolicy> 添加到我的设置文件 (C:\Program Files\NetBeans 7.0\java\maven\conf\settings.xml)

<profile>
  <id>nexus</id>
  <!--Enable snapshots for the built in central repo to direct -->
  <!--all requests to nexus via the mirror -->
  <repositories>
    <repository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
      <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
    </repository>
  </repositories>
 <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases>
      <snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots>
    </pluginRepository>
  </pluginRepositories>
</profile>

在我的情况下没有帮助。
s
sfletche

虽然您可以通过全新安装(覆盖任何缓存的依赖项)来解决此问题,正如 @Sanjeev-Gulgani 建议的 mvn -U clean install

您也可以简单地删除导致问题的缓存依赖项

mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"

有关详细信息,请参阅 mvn docs


但是为什么 Maven 会中止构建呢?为什么不只使用本地存储库中的缓存依赖项?为什么必须删除它才能让 Maven 获取它?!
只有真正适用于工件的发布版本的答案。
8
8bitjunkie

根据设置reference

updatePolicy:此元素指定尝试更新的频率。 Maven 会将本地 POM 的时间戳(存储在存储库的 maven-metadata 文件中)与远程进行比较。选项包括:总是、每天(默认)、间隔:X(其中 X 是以分钟为单位的整数)或从不。

例子:

<profiles>
    <profile>
      ...
      <repositories>
        <repository>
          <id>myRepo</id>
          <name>My Repository</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
         </repository>
      </repositories>
      ...
    </profile>
  </profiles>
  ...
</settings>

谢谢回复;但是,我已经对“updatePolicy”设置进行了相当多的实验,它似乎对“未找到”/“缓存失败”/“分辨率不会被重新尝试”错误没有影响。
P
Pravin Bansal

这在您从本地 Maven 存储库中删除相关依赖项后有效

/user/.m2/repository/path

M
MattC

这个错误有时会产生误导。您可能要检查的两件事:

repo 中的依赖项是否有实际的 JAR?您的错误消息包含它正在搜索的 URL,因此请转到那里,然后浏览到与您的依赖项匹配的文件夹。有罐子吗?如果没有,你需要改变你的依赖。 (例如,当您应该指向子项目时,您可能指向顶级父依赖项)如果远程仓库中存在 jar,则只需删除本地副本。它将位于 .m2/repository 下的主目录中(除非您进行了不同的配置)(如果在 Linux 上,则 ls -a 显示隐藏)。


这与OP的问题无关。显示错误的原因不是重点。 OP 想知道如何设置重试间隔。
这可能是 OP 帖子背后的隐含问题,结果证明是我的问题。结果我的 中有一个错字,通过查看选项一,我走上了正确的道路。
问题是如何设置间隔?
a
ashoka

如果您使用的是 Eclipse,请转到 Windows -> Preferences -> Maven 并取消选中“不要自动更新来自远程存储库的依赖项”复选框。

这也适用于 Maven 3。


验证:eclipse:Juno Service Release 2. m2e:v 1.3.1
这不能回答 OP 的问题。
R
Riadh

您需要从存储库中删除所有“_maven.repositories”文件。


没有帮助,或者至少对我来说没有帮助
它对我有用。不过,我并没有将它们全部删除,只是该特定依赖文件夹中的一个
N
NoraT

我在使用不同的工件时遇到了类似的错误。

<...> 已缓存在本地存储库中,直到经过中央的更新间隔或强制更新后才会重新尝试解析

上述解决方案都不适合我。我终于在 IntelliJ IDEA 中通过 File > Invalidate Caches / Restart ... > Invalidate and Restart 解决了这个问题。


E
Emeric

对于 Intellij 用户,以下内容对我有用:

右键单击您的包裹

Maven > Reimport 

Maven > Generate Sources and Update Folders

c
chipiik

如果您使用 Nexus 作为代理存储库,它具有“未找到缓存 TTL”设置,默认值为 1440 分钟(或 24 小时)。降低此值可能会有所帮助(存储库 > 配置 > 过期设置)。

有关详细信息,请参阅 documentation


L
Lyju I Edwinson

我是怎么遇到这个问题的

当我从 Eclipse Juno 更改为 Luna,并从 SVN repo 签出我的 maven 项目时,我在构建应用程序时遇到了同样的问题。

我试过什么?我尝试清理本地存储库,然后使用 -U 选项再次更新所有版本。但我的问题还在继续。

然后我转到 Window --> Preferences -> Maven --> User Settings --> 并单击 Local Repository 下的 Reindex 按钮,然后等待 reindex 发生。

就这样,问题解决了。


这不能回答 OP 的问题。
x
xerx593

最后回答标题问题:它是(项目,配置文件或设置)中的(客户端设置)

[plugin]?[r|R]epository/[releases|snapshots]/updatePolicy

... 标签。

(目前,maven:3.6.0,但我认为“向后”兼容)可能的值是:

/** * 从不更新本地缓存的数据。 */ public static final String UPDATE_POLICY_NEVER = "never"; /** * 总是更新本地缓存的数据。 */ public static final String UPDATE_POLICY_ALWAYS = "always"; /** * 每天更新一次本地缓存的数据。 */ public static final String UPDATE_POLICY_DAILY = "daily"; /** * 更新本地缓存的数据**每 X 分钟**一次,由 "interval:X" 给出。 */ public static final String UPDATE_POLICY_INTERVAL = "interval";

此标签的当前(maven 3.6.0)评估实现如下:

public boolean isUpdatedRequired(RepositorySystemSession session, long lastModified, String policy) { boolean checkForUpdates;如果(政策==空){政策=“”; } if ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( 策略 ) ) { checkForUpdates = true; } else if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals(policy) ) { Calendar cal = Calendar.getInstance(); cal.set(日历.HOUR_OF_DAY, 0); cal.set(日历.分钟,0); cal.set(日历.SECOND, 0); cal.set(日历.MILLISECOND, 0); checkForUpdates = cal.getTimeInMillis() > lastModified; } else if ( policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) ) { int minutes = getMinutes( policy );日历 cal = Calendar.getInstance(); cal.add(日历.分钟,-分钟); checkForUpdates = cal.getTimeInMillis() > lastModified; } else { // 假设“从不” checkForUpdates = false; if (!RepositoryPolicy.UPDATE_POLICY_NEVER.equals(policy)) { LOGGER.warn("未知的存储库更新策略'{}',假设为'{}'", policy, RepositoryPolicy.UPDATE_POLICY_NEVER); } } 返回检查更新; }

..和:

私人 int getMinutes(字符串策略){ int 分钟;尝试 { String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );分钟 = Integer.valueOf( s ); } catch ( RuntimeException e ) { 分钟 = 24 * 60; LOGGER.warn("不可解析的存储库更新策略 '{}', 假设 '{}:1440'", policy, RepositoryPolicy.UPDATE_POLICY_INTERVAL ); } 返回分钟; }

...其中 lastModified 是一个/每个基础工件的(本地文件)“修改时间戳”。

特别是对于 interval:x 设置:

冒号 : 不是那么严格 - 任何“非空”字符都可以做到(=, , ...)。

负值 x < 0 应该产生“从不”。

间隔:0 我会假设一个“分钟”(0-59 秒或以上......)间隔。

数字格式异常会导致 24 * 60 分钟(~“每天”)。

..参见:DefaultUpdatePolicyAnalyzerDefaultMetadataResolver#resolveMetadata()RepositoryPolicy


V
Vysakhan Kasthuri

Maven 具有 updatePolicy 设置,用于指定检查存储库中的更新或使存储库与远程保持同步的频率。

updatePolicy 的默认值为每天。

其他值可以是始终/从不/XX(以分钟为单位指定间隔)。

下面的代码示例可以添加到 maven 用户设置文件以配置 updatePolicy。

<pluginRepositories>
    <pluginRepository>
        <id>Releases</id>
        <url>http://<host>:<port>/nexus/content/repositories/releases/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>             
</pluginRepositories>

这不能回答 OP 的问题。 OP 很清楚,他们了解问题所在以及如何更新其本地 m2 存储库。 OP 正在询问间隔的位置以及如何更改间隔。根本没有提到任何IDE。你没有读过这个问题。
@8bitjunkie 这非常直接地回答了这个问题:If client-side, how do I configure it?。这个答案与任何 IDE 功能无关。它是 mvn 唯一的存储库配置。 updatePolicy 是 OP 询问的时间间隔。
M
Maria Pomazkina-Karpikova

就我而言,解决方案很愚蠢:我只是有不正确的依赖版本。


D
Darshana

有点相关..我得到

“[错误] 无法在项目 testproject 上执行目标:无法解析项目 myjarname:jar:1.0-0 的依赖项:无法在 http://repo1.maven.org/maven2 中找到 myjarname-core:bundle:1.0-0已缓存在本地存储库中,直到中央的更新间隔已过或强制更新 -> [帮助1] 才会重新尝试解析

此错误是由于意外使用 Maven 3 而不是 Maven 2 而引起的。只是想它可能会节省一些时间,因为我最初的谷歌搜索把我带到了这个页面。


如果您的项目强制您使用 Maven 3 怎么办?您对两个版本之间发生了什么变化有任何线索吗?
这正是我的问题所在。不知道为什么 Maven 3 与 2 如此不同。感谢您发布此内容并避免我浪费更多时间寻找解决方案。
如何安装 maven2 而不是 maven3?
非常笼统的问题..什么操作系统?对于 Ubuntu,您可以执行“sudo apt-get install maven2”... 或者对于任何 Linux/UNIX,您只需下载存档并自行编译,将其添加到您的路径中。尝试:shameerarathnayaka.blogspot.com/2012/01/…
这对我有用事实上,我从我的 answer here 链接回这个。
E
Ed Manners

我有同样的错误,(不会重新尝试解决...)但我有不同的要求,因为我的本地存储库中有文件,目前无法远程使用(旧的过时库和内部库),以及我的公司关系系统已关闭,但它们确实存在于我的 .m2 存储库中。

Maven 仍然拒绝构建,产生上述相同的错误。

对于有问题的库,我刚刚删除了相应的文件:

_remote.repositories 示例路径:users\[username]\.m2\[offending jar path]\[versionnumber]\_remote.respositories

知道这些文件仅在本地可用。

注意:长期解决方案,我可能应该让我们以前的 nexus 系统启动并运行,对于那些遗留的 jar,将它们检入到 lib 文件夹下的项目中(或类似的东西)


A
Amin Heydari Alashti

我遇到了这个问题,this 中提出的全面描述帮助我解决了这个问题。

第二个宣布的问题是我的问题。我使用了一个刚刚添加的第三方存储库,它在我的项目中执行 pom 文件的 repository 部分。我将相同的存储库信息添加到 pluginrepository 以解决此问题。


h
hami

我在我的私人存储库上上传第三方库时遇到了同样的问题。有时所描述的修复对我有用,但有时它们没有。

我认为问题的根本原因是工件缺少 pom.xml 文件。 (第三方工件的 pom.xml 不是您项目中的 pom.xml)。我假设 Maven 期望每个工件都有一个 pom.xml,因此它可以解决所有工件的依赖关系。有时它可以在没有 pom.xml 的情况下工作,但有时它不能(我没有确定,当它没有时)。

我使用 Nexus3 作为私有存储库。当您上传工件时,您可以选中一个选项来为工件生成 pom.xml 文件。


M
Mert Aksoy

在我的 settings.xml 中更改 localRepository 路径解决了这个问题


T
Tal Hakmon

确保您正在寻找的工件存在,如果它在您的本地项目上运行: cd .. cd 项目名称 mvn clean install

然后你将在本地拥有它。

为了更好的做法: mvn clean deploy 这样你就可以再次使用它而不会出现这个问题