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

时间:2011-01-31 21:25:50

标签: maven artifactory

对于maven,我偶尔会点击一些来自我尚未构建或包含在我的存储库中的第三方存储库的工件。

我会从maven客户端收到一条错误消息,指出无法找到工件:

  

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

现在,明白这意味着什么,并且可以简单地用-U重新运行我的命令,而且事情通常可以在那里正常工作

但是,我发现这个错误信息非常不直观,我试图让我的同事感到头疼。

我想知道是否有一些地方可以修改此update interval设置。

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

22 个答案:

答案 0 :(得分:233)

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

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

答案 1 :(得分:101)

您可以删除本地存储库中相应的失败工件目录。而且你也可以在目标中使用-U。它会做的工作。这适用于maven 3.所以不需要降级到maven 2.

答案 2 :(得分:59)

我有一个相关问题,但Raghuram的答案有所帮助。 (我还没有足够的声誉来表达他的答案)。我正在使用与NetBeans捆绑在一起的Maven,并且得到相同的“...被缓存在本地存储库中,在nexus的更新间隔已经过去或强制更新之前不会重新尝试解析 - > [帮助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>

答案 3 :(得分:32)

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

决议:

使用

mvn -U clean install

-U将强制更新回购

或使用

<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中的

答案 4 :(得分:32)

根据设置reference

  

updatePolicy:此元素指定更新应尝试发生的频率。 Maven将比较本地POM的时间戳(存储   在存储库的maven-metadata文件中)到远程。 选择是:   always,daily(默认值),interval: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>

答案 5 :(得分:8)

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

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

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

答案 6 :(得分:8)

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

这也适用于Maven 3.

答案 7 :(得分:6)

您需要删除所有&#34; _maven.repositories&#34;来自存储库的文件。

答案 8 :(得分:4)

尽管您可以按照@ Sanjeev-Gulgani的建议通过全新安装(覆盖所有缓存的依赖项)来解决此问题

mvn -U clean install

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

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

有关更多信息,请参见mvn docs

答案 9 :(得分:4)

在您从本地Maven存储库中删除相关的依赖项后,此方法有效

/user/.m2/repository/path

答案 10 :(得分:3)

我有一个类似的错误,但工件不同。

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

以上描述的解决方案都不对我有用。我终于在 IntelliJ IDEA 中解决了此问题 文件>使缓存无效/重新启动...>使并无效

答案 11 :(得分:2)

我是怎么解决这个问题的,

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

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

然后我去了Window - &gt;偏好 - &gt; Maven - &gt;用户设置 - &gt;并单击Local Repository下的Reindex按钮并等待reindex发生。

总而言之,问题已得到解决。

答案 12 :(得分:2)

如果你使用Nexus作为代理仓库,它有&#34; Not Found Cache TTL&#34;设置默认值1440分钟(或24小时)。降低此值可能会有所帮助(存储库&gt;配置&gt;到期设置)。

有关详细信息,请参阅documentation

答案 13 :(得分:0)

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

答案 14 :(得分:0)

确保您正在寻找的工件存在,如果它在您的本地项目上运行: 光盘.. cd 项目名称 mvn 全新安装

然后您将在本地拥有它。

为了更好的练习,请执行以下操作: mvn clean deploy 这样你就可以再次使用它而不会出现这个问题

答案 15 :(得分:0)

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

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

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

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

右键单击您的包裹

Maven > Reimport 

Maven > Generate Sources and Update Folders

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

[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;
}

.. with:

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

答案 20 :(得分:0)

有点相关......我得到了

  

“[错误]无法在项目testproject上执行目标:无法解决项目myjarname的依赖关系:jar:1.0-0:未能找到myjarname-core:bundle:1.0-0 http://repo1.maven.org/maven2中的缓存本地存储库,在中心的更新间隔过去或强制更新之前,不会重新尝试解析 - &gt; [帮助1]“

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

答案 21 :(得分:-1)

在Eclipse中:

  • 右键单击项目 - &gt;运行方式 - &gt; Maven构建 - &gt;将目标指定为&#34;清理安装&#34; - &GT;&GT;必需的工件将下载到本地存储库。
  • - &GT;&GT;当Build SUCCESS !! - &GT;右键单击Project-&gt; Maven - &gt;更新项目(检查清洁)。