当maven说“直到MyRepo的更新间隔过去后,才会重新尝试解析”,该间隔在哪里指定?


586

使用Maven时,我偶尔会碰到一些来自我尚未构建或未包含在存储库中的第三方存储库中的工件。

我将从Maven客户端收到一条错误消息,提示找不到工件:

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

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

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

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

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

11
将另外1个依赖项添加到pom.xml后,我得到了相同的错误消息。对我来说,这显然是一个错误。我不明白为什么会这样!如果我在项目中添加依赖项,并且运行mvn compile,则应该下载jar文件。这种行为完全是胡说!
罗伯特·雷兹


我刚刚经历了这一点,在阅读了所有答案之后,另一个额外的步骤是在Eclipse中重新导入项目(以我为例)。Eclipse一直用我的不在其中的插件来烦我,这太奇怪了pom.xml
隐身

对我来说一个重要的问题!谢谢哥们儿!
Noddy先生

对我来说,原来有一个特定的仓库链接到了GitHub,URL脱机了(获取404)。我将存储库更新到我们的内部服务器,并且可以正常工作。
cbmeeks

Answers:


286

我以前通过删除本地存储库中相应的无法下载工件目录来解决此问题。下次我运行maven命令时,再次触发工件下载。因此,我想说这是一个客户端设置。

连结端(伺服器回购端),这个问题已解决,可设定排程工作。-U正如您已经指出的那样,在客户端,这是使用完成的。


7
“我通过删除本地存储库中相应的未能下载的工件目录来解决此问题。” 这对我有用。我也在使用Netbeans。

16
如果Maven指出缓存的工件是无效的,为什么不能自己解决呢?
Stefan

1
“配置计划的任务”和“使用-U完成”是什么意思,您可以将其放入客观的Eclipse UI术语中吗?
user2568374

1
我假设您的意思是Eclipse IDE。理论上讲,您需要下载最新的SNAPSHOT。为此,您需要在maven命令中添加“ -U”参数,例如mvn clean compile -U。现在,您可以通过命令行或通过选中“始终更新快照”框来通过Eclipse运行此maven命令。不确定,这些天我使用intellij。“配置计划的任务”部分是指您要在Nexus服务器上进行的特定配置。后者与Eclipse无关。
Christian Achilli

10
这不能回答OP的实际问题。
8bitjunkie 2015年

116

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


2
为什么这么简单就搞乱存储库配置?
Koraktor

9
在回答之前,请仔细阅读问题。OP正在询问如何设置时间间隔,而不是如何强制更新。
i3ensays 2014年

2
这不是问题的答案,而是人们遇到这种异常时需要的东西。因为在进行本地库开发时,最好是删除这样的库,而不要让间隔使您感到困惑。
mcvkr

我们应该在下面添加有效的存储库~/.m2/settings.xml/<repositories>以使用-U选项解决此问题
Kanagavelu Sugumar,

64

我有一个相关的问题,但Raghuram的回答有所帮助。(我还没有足够的声誉来投票赞成他的答案)。我使用的是与NetBeans捆绑在一起的Maven,并且得到了相同的“ ...已缓存在本地存储库中,直到关系的更新间隔过去或强制执行更新-> [[帮助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>

8
对我的情况没有帮助。
arcy

64

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

解析度 :

无论使用

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中


39

根据设置参考

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>

7
谢谢回复; 但是,我已经对“ updatePolicy”设置进行了很多试验,它似乎对“未找到” /“失败的缓存” /“无法重新尝试解决”错误没有影响。
cprice404

23

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

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

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

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


9

该错误有时可能会引起误解。您可能要检查的2件事:

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

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


4
这与OP的问题无关。显示错误的原因不是重点。OP想知道如何设置重试间隔。
8bitjunkie

1
这可能是OP帖子背后的隐含问题,原来是我的问题。原来我的<groupId>中有一个错字,通过检查选项一可以使我走上正确的道路。
James Oravec

1
问题是如何设置间隔?
smilyface

7

如果使用的是Eclipse,请转至Windows->首选项-> Maven,然后取消选中“不自动从远程存储库更新依赖项”复选框。

这也适用于Maven 3。


1
已验证:eclipse:Juno Service
Release2。m2e

8
这不能回答OP的问题。
8bitjunkie

5

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


3
无济于事,或者至少对我而言没有帮助
arcy

1
它为我工作。但是,我并没有全部删除,而是仅删除了该特定依赖项文件夹中的一个
Piyin

5

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

/user/.m2/repository/path

这就像一种魅力
Jadda

3

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

请参阅文档以获取更多信息。


2

我是怎么得到这个问题的

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

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

然后我转到窗口->首选项-> Maven->用户设置->并单击本地存储库下的重新索引按钮,然后等待重新索引发生。

就这样,问题就解决了。


4
这不能回答OP的问题。
8bitjunkie

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

..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


1

对于Intellij用户,以下对我有用

右键点击您的包裹

Maven > Reimport 

Maven > Generate Sources and Update Folders

0

有点关系..我越来越

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

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


2
如果您的项目强迫您使用Maven 3,该怎么办?您对这两个版本之间的变化有任何了解吗?
Xr。

1
这正是我的问题所在。不知道为什么Maven 3与2如此不同。谢谢您的发布,并避免了我浪费更多的时间寻找解决方案。
CatsAndCode

如何安装maven2而不是maven3?
万亿美元,

很通用的问题..什么操作系统?对于Ubuntu,您可以执行“ sudo apt-get install maven2” ...;对于任何Linux / UNIX,您只需下载存档并自己编译即可,然后将其添加到路径中。尝试:shameerarathnayaka.blogspot.com/2012/01/...
sdanzig

这对我有用,实际上我从这里的答案链接回了这个。
shiri

0

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>

3
这不能回答OP的问题。OP很清楚他们了解问题所在以及如何更新其本地m2存储库。OP正在询问间隔的位置以及如何更改间隔。完全没有提及任何IDE。您尚未阅读问题。
8bitjunkie

@ 8bitjunkie这可以直接回答问题:If client-side, how do I configure it?。这个答案与任何IDE功能无关。这是mvn唯一的存储库配置。这updatePolicy是OP询问的时间间隔。
montrivo

这可能是接受的答案@ cprice404。
montrivo


0

我有这个问题,所提出的全面描述帮助我解决这个问题。

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


0

我在使用其他工件时也遇到了类似的错误。

<...>已缓存在本地存储库中,直到中心的更新间隔过去或强制执行更新后,解决方案才会重新尝试

上述解决方案都不适合我。我终于在IntelliJ IDEA中通过“ 文件”>“使缓存无效/重新启动...”>“使无效并重新启动”解决了这一问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.