724

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

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

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

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

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

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

  1. 此错误消息中提到的是update interval客户端还是服务器端设置?
  2. 如果是客户端,我该如何配置?
  3. 如果是服务器端,是否有人知道 Nexus/Artifactory 如何/是否公开这些设置?
4

22 回答 22

352

I used to solve this issue by deleting the corresponding failed to download artifact directory in my local repo. Next time I run the maven command the artifact download is triggered again. Therefore I'd say it's a client side setting.

Nexus side (server repo side), this issue is solved configuring a scheduled task. Client side, this is done using -U, as you already pointed out.

于 2011-05-25T15:56:47.080 回答
140

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

于 2013-04-02T06:42:59.737 回答
124

基本上发生的是,根据 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

于 2018-05-01T17:13:58.190 回答
67

我有一个相关的问题,但 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>
于 2011-05-18T18:13:05.013 回答
48

根据设置参考

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>
于 2011-02-01T02:33:29.933 回答
47

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

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

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

有关更多信息,请参阅mvn 文档

于 2018-12-14T18:45:18.187 回答
13

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

/user/.m2/repository/path
于 2019-07-31T18:48:29.883 回答
9

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

  1. repo 中的依赖项是否有实际的 JAR?您的错误消息包含它正在搜索的 URL,因此请转到那里,然后浏览到与您的依赖项匹配的文件夹。有罐子吗?如果没有,你需要改变你的依赖。(例如,当您应该指向子项目时,您可能指向顶级父依赖项)

  2. 如果远程仓库中存在 jar,则只需删除本地副本。它将位于 .m2/repository 下的主目录中(除非您进行了不同的配置)(如果在 Linux 上,则 ls -a 显示隐藏)。

于 2015-06-26T22:17:33.377 回答
7

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

于 2014-10-14T08:59:24.017 回答
7

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

这也适用于 Maven 3。

于 2013-06-25T07:06:59.697 回答
6

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

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

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

于 2020-04-02T08:10:53.700 回答
3

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

有关更多信息,请参阅文档

于 2015-10-07T21:34:24.153 回答
3

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

右键单击您的包裹

Maven > Reimport 

Maven > Generate Sources and Update Folders
于 2019-10-17T09:52:28.653 回答
2

我是怎么遇到这个问题的

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

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

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

就这样,问题解决了。

于 2014-07-21T01:08:40.540 回答
2

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

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

... 标签。

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

/**
 * Never update locally cached data.
 */
public static final String UPDATE_POLICY_NEVER = "never";
/**
 * Always update locally cached data.
 */
public static final String UPDATE_POLICY_ALWAYS = "always";
/**
 * Update locally cached data once a day.
 */
public static final String UPDATE_POLICY_DAILY = "daily";
/**
 * Update locally cached data **every X minutes** as given by "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 ( policy == null )
    {
        policy = "";
    }
    if ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) )
    {
        checkForUpdates = true;
    }
    else if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) )
    {
        Calendar cal = Calendar.getInstance();
        cal.set( Calendar.HOUR_OF_DAY, 0 );
        cal.set( Calendar.MINUTE, 0 );
        cal.set( Calendar.SECOND, 0 );
        cal.set( Calendar.MILLISECOND, 0 );
        checkForUpdates = cal.getTimeInMillis() > lastModified;
    }
    else if ( policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
    {
        int minutes = getMinutes( policy );
        Calendar cal = Calendar.getInstance();
        cal.add( Calendar.MINUTE, -minutes );
        checkForUpdates = cal.getTimeInMillis() > lastModified;
    }
    else
    {
        // assume "never"
        checkForUpdates = false;
        if ( !RepositoryPolicy.UPDATE_POLICY_NEVER.equals( policy ) )
        {
            LOGGER.warn( "Unknown repository update policy '{}', assuming '{}'",
                    policy, RepositoryPolicy.UPDATE_POLICY_NEVER );
        }
    }
    return checkForUpdates;
}

..和:

private int getMinutes( String policy )
{
    int minutes;
    try
    {
        String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );
        minutes = Integer.valueOf( s );
    }
    catch ( RuntimeException e )
    {
        minutes = 24 * 60;
        LOGGER.warn( "Non-parseable repository update policy '{}', assuming '{}:1440'",
                policy, RepositoryPolicy.UPDATE_POLICY_INTERVAL );
    }
    return minutes;
}

...lastModified一个/每个底层工件的(本地文件)“修改时间戳”在哪里。


特别是对于interval:x设置:

  • 冒号:并不那么严格——任何“非空”字符都可以做到(=, , ...)。
  • 负值x < 0应该屈服于“从不”。
  • interval:0我会假设一个“分钟”(0-59秒或以上......)间隔。
  • 数字格式异常以24 * 60分钟为单位(~“每天”)。

..参见:DefaultUpdatePolicyAnalyzerDefaultMetadataResolver#resolveMetadata()RepositoryPolicy

于 2019-02-20T13:52:14.883 回答
2

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

于 2019-09-09T23:10:14.023 回答
1

有点相关..我得到

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

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

于 2012-06-13T15:45:53.627 回答
1

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>
于 2016-04-30T15:06:10.047 回答
0

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

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

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

于 2021-05-05T10:30:15.020 回答
0

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

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

于 2019-10-26T12:41:31.600 回答
0

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

于 2021-08-10T14:27:40.257 回答
-1

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

然后你将在本地拥有它。

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

于 2021-05-05T12:49:48.190 回答