使用maven,我偶尔会遇到来自第三方回购的工件,这些工件我还没有构建或包含在我的存储库中。

我将从maven客户端得到一个错误消息,说无法找到工件:

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

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

然而,我发现这个错误消息非常不直观,我试图让我的同事们不那么头疼。

我试图弄清楚是否有一些地方,我可以修改这个更新间隔设置。

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


根据设置参考:

updatePolicy:该元素指定更新尝试发生的频率。Maven将比较本地POM的时间戳(存储 在存储库的maven-元数据文件中)到远程。选项是: 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>

我有一个相关的问题,但拉格拉姆的回答帮了我。(我还没有足够的声誉来为他的答案投票)。我正在使用与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>

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

Nexus端(服务器回收端),此问题是通过配置定时任务解决的。 客户端,这是使用-U完成的,正如您已经指出的那样。


有些有关. .我正在

"[错误]未能在项目testproject上执行目标:无法解决项目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 repo签出我的maven项目时,我在构建应用程序时遇到了同样的问题。

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

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

就这样,问题解决了。


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


这个错误有时会误导人。你可能需要检查两件事:

Is there an actual JAR for the dependency in the repo? Your error message contains a URL of where it is searching, so go there, and then browse to the folder that matches your dependency. Is there a jar? If not, you need to change your dependency. (for example, you could be pointing at a top level parent dependency, when you should be pointing at a sub project) If the jar exists on the remote repo, then just delete your local copy. It will be in your home directory (unless you configured differently) under .m2/repository (ls -a to show hidden if on Linux).


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

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


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

updatePolicy的默认值为每日。 其他值可以是always / never/ 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>

基本上发生的情况是,根据maven的默认updatePolicy, maven将每天从repo中获取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中


虽然你可以解决这个问题用一个干净的安装(覆盖任何缓存的依赖)@Sanjeev-Gulgani建议用mvn -U清洁安装

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

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

更多信息请参见mvn文档。


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

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

... 标签。

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

/** *从不更新本地缓存数据。 * / UPDATE_POLICY_NEVER = "never"; /** *总是更新本地缓存的数据。 * / public static final String UPDATE_POLICY_ALWAYS = "always"; /** *每天更新一次本地缓存数据。 * / UPDATE_POLICY_DAILY = "每日"; /** *更新本地缓存数据**每X分钟**由“interval:X”给出。 * / 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策略) { int分钟; 试一试 { 字符串s = policy。substring(RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1); minutes =整数。valueOf(s); } catch (RuntimeException) { 分钟= 24 * 60; 记录器。警告("不可解析的存储库更新策略'{}',假设'{}:1440'", 政策,RepositoryPolicy。UPDATE_POLICY_INTERVAL); } 返回分钟; }

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


特别是对于interval:x设置:

冒号:并不是那么严格——任何“非空”字符都可以这样做(=,,…)。 x < 0的负值应该屈服于"never"。 我假设是“分钟”(0-59秒)。或以上…)区间。 数字格式异常导致24 * 60分钟(~“daily”)。

..参见:DefaultUpdatePolicyAnalyzer, DefaultMetadataResolver#resolveMetadata()和RepositoryPolicy


在您从本地maven存储库中删除相关依赖项之后,这就可以工作了

/user/.m2/repository/path

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


对于Intellij用户,以下方法对我来说是有效的:

右键单击您的包

Maven > Reimport 

and

Maven > Generate Sources and Update Folders

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

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


我在另一件藏物上也犯了类似的错误。

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

以上所描述的解决方案对我都不起作用。我最终在IntelliJ IDEA解决了这个问题 文件>无效缓存/重启…>无效并重启。


在我的私有存储库上上传第三方库时,我也遇到了同样的问题。有时所描述的修复方法对我有效,但有时无效。

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

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


确保您正在寻找的工件是存在的,如果它在您的本地项目运行: cd . . CD项目名称 MVN清洁安装

然后你就可以在当地吃了。

为了更好的练习,请: MVN清洁部署,因此您可以再次使用它而不会出现此问题


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


我有同样的错误,(解决将不会重新尝试…),但我有不同的需求,因为我在我的本地存储库中有文件,目前不能远程使用(旧的过时的库和内部库),我的公司nexus系统宕机,但它们确实存在于我的.m2回购。

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

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

_remote.repositories 例如:users\[username]\。m2 \[冒犯jar \ [versionnumber] \ _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**