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

使用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/Arti工厂暴露这些设置?
931979 次浏览

根据设置参考

更新策略此元素指定更新应该尝试发生的频率。Maven将比较本地POM的时间戳(存储的 在存储库的maven-元数据文件中)到远程。 始终,每日(默认),间隔: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>

我遇到了一个相关的问题,但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>

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

Nexus侧(服务器存储侧),这个问题在配置计划任务时得到解决。 客户端,这是使用-U完成的,正如您已经指出的那样。

有点相关…我得到

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

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

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

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

这也适用于Maven 3。

我怎么会有这个问题,

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

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

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

就这样,问题解决了。

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

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

  1. 存储库中的依赖项是否有实际的JAR?你的错误消息包含它正在搜索的URL,所以去那里,然后浏览到与你的依赖项匹配的文件夹。有jar吗?如果没有,你需要更改你的依赖项。(例如,你可以指向顶级父依赖项,而你应该指向一个子项目)

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

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

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

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

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

基本上发生的是,根据默认的updatePolicy maven. Maven每天都会从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

虽然你可以用干净的安装来解决这个问题(覆盖任何缓存的依赖项),正如@Sanjeev-Gulgani建议的那样mvn -U clean install

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

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

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

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

[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分钟(每天~")。

…请参阅:默认更新策略分析器默认元数据解析器#解决元数据()仓库策略

这在您从本地maven存储库中删除相关依赖项后起作用

/user/.m2/repository/path

在我的情况下,解决方案是愚蠢的:我只是有不正确的依赖版本。

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

右键单击您的包裹

Maven > Reimport

Maven > Generate Sources and Update Folders

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

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

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

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

上述解决方案都不适合我。我终于在IntelliJ IDEA中解决了这个问题 文件>无效缓存/重新启动…>无效并重新启动

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

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

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

确保您正在寻找的工件存在,如果它在您的本地项目运行: cd… cd项目名称 mvn干净安装

你将在当地拥有它。

为了更好的实践: mvn干净的部署,所以你可以再次使用它没有这个问题

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

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

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

对于违规的库,我只是删除了相应的文件:

_remote.repositories

示例路径:用户\[用户名]\. m2\[违规jar path]\[版本号]\_remote.respositories

知道这些文件在本地可用只有

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

我已经解决了!

我之前遇到过这个问题,在查看了一些评论后,它奏效了。 我们只需要在{m2_home}/. m2下更正settings.xml文件

**<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>.m2/repository</localRepository>
<profiles>
<profile>
<repositories>
<repository>
<id>projectid</id>
<url>http://localhost</url>
<name>Project name</name>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
</repository>
</repositories>
</profile>
</profiles>
</settings>**

并执行maven Clean install命令。

**/maven_home/mvn -f project_directory/pom.xml -DskipTests clean install**