使用 maven,我偶尔会遇到一个来自我尚未构建或包含在我的存储库中的一些 3rd 方存储库的工件。
我会从 maven 客户端收到一条错误消息,说找不到工件:
http://myrepo:80/artifactory/repo 中找不到 org.jfrog.maven.annomojo:maven-plugin-anno:jar:1.4.0 失败缓存在本地仓库中,直到更新间隔才会重新尝试解析MyRepo 已过期或强制更新 -> [帮助 1]
现在,我明白这意味着什么,可以简单地使用 -U
重新运行我的命令,并且从此以后一切正常。
但是,我发现此错误消息非常不直观,并试图让我的同事免于头疼。
我想弄清楚是否有可以修改此 update interval
设置的地方。
此错误消息中提到的更新间隔是客户端设置还是服务器端设置?如果是客户端,我该如何配置?如果是服务器端,是否有人知道 Nexus/Artifactory 如何/是否公开这些设置?
pom.xml
中的插件来骚扰我,这太奇怪了。
我曾经通过删除本地 repo 中相应的无法下载工件目录来解决此问题。下次我运行 maven 命令时,会再次触发工件下载。因此,我会说这是客户端设置。
Nexus 端(服务器 repo 端),配置计划任务解决了这个问题。正如您已经指出的,客户端,这是使用 -U
完成的。
基本上发生的是,根据 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
NoClassDefFoundError
。
您可以删除本地存储库中相应的失败工件目录。您也可以简单地在目标中使用 -U
。它会完成这项工作。这适用于 maven 3。因此无需降级到 maven 2。
~/.m2/settings.xml/<repositories>
下添加有效的存储库,以使用 -U 选项解决此问题
我有一个相关的问题,但 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>
虽然您可以通过全新安装(覆盖任何缓存的依赖项)来解决此问题,正如 @Sanjeev-Gulgani 建议的 mvn -U clean install
您也可以简单地删除导致问题的缓存依赖项
mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"
有关详细信息,请参阅 mvn docs。
根据设置reference:
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>
这在您从本地 Maven 存储库中删除相关依赖项后有效
/user/.m2/repository/path
这个错误有时会产生误导。您可能要检查的两件事:
repo 中的依赖项是否有实际的 JAR?您的错误消息包含它正在搜索的 URL,因此请转到那里,然后浏览到与您的依赖项匹配的文件夹。有罐子吗?如果没有,你需要改变你的依赖。 (例如,当您应该指向子项目时,您可能指向顶级父依赖项)如果远程仓库中存在 jar,则只需删除本地副本。它将位于 .m2/repository 下的主目录中(除非您进行了不同的配置)(如果在 Linux 上,则 ls -a 显示隐藏)。
如果您使用的是 Eclipse,请转到 Windows -> Preferences -> Maven 并取消选中“不要自动更新来自远程存储库的依赖项”复选框。
这也适用于 Maven 3。
您需要从存储库中删除所有“_maven.repositories”文件。
我在使用不同的工件时遇到了类似的错误。
<...> 已缓存在本地存储库中,直到经过中央的更新间隔或强制更新后才会重新尝试解析
上述解决方案都不适合我。我终于在 IntelliJ IDEA 中通过 File > Invalidate Caches / Restart ... > Invalidate and Restart 解决了这个问题。
对于 Intellij 用户,以下内容对我有用:
右键单击您的包裹
Maven > Reimport
和
Maven > Generate Sources and Update Folders
如果您使用 Nexus 作为代理存储库,它具有“未找到缓存 TTL”设置,默认值为 1440 分钟(或 24 小时)。降低此值可能会有所帮助(存储库 > 配置 > 过期设置)。
有关详细信息,请参阅 documentation。
我是怎么遇到这个问题的
当我从 Eclipse Juno 更改为 Luna,并从 SVN repo 签出我的 maven 项目时,我在构建应用程序时遇到了同样的问题。
我试过什么?我尝试清理本地存储库,然后使用 -U 选项再次更新所有版本。但我的问题还在继续。
然后我转到 Window --> Preferences -> Maven --> User Settings --> 并单击 Local Repository 下的 Reindex 按钮,然后等待 reindex 发生。
就这样,问题解决了。
最后回答标题问题:它是(项目,配置文件或设置)中的(客户端设置)
[plugin]?[r|R]epository/[releases|snapshots]/updatePolicy
... 标签。
(目前,maven:3.6.0,但我认为“向后”兼容)可能的值是:
/** * 从不更新本地缓存的数据。 */ public static final String UPDATE_POLICY_NEVER = "never"; /** * 总是更新本地缓存的数据。 */ public static final String UPDATE_POLICY_ALWAYS = "always"; /** * 每天更新一次本地缓存的数据。 */ public static final String UPDATE_POLICY_DAILY = "daily"; /** * 更新本地缓存的数据**每 X 分钟**一次,由 "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 ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( 策略 ) ) { checkForUpdates = true; } else if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals(policy) ) { Calendar cal = Calendar.getInstance(); cal.set(日历.HOUR_OF_DAY, 0); cal.set(日历.分钟,0); cal.set(日历.SECOND, 0); cal.set(日历.MILLISECOND, 0); checkForUpdates = cal.getTimeInMillis() > lastModified; } else if ( policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) ) { int minutes = getMinutes( policy );日历 cal = Calendar.getInstance(); cal.add(日历.分钟,-分钟); checkForUpdates = cal.getTimeInMillis() > lastModified; } else { // 假设“从不” checkForUpdates = false; if (!RepositoryPolicy.UPDATE_POLICY_NEVER.equals(policy)) { LOGGER.warn("未知的存储库更新策略'{}',假设为'{}'", policy, RepositoryPolicy.UPDATE_POLICY_NEVER); } } 返回检查更新; }
..和:
私人 int getMinutes(字符串策略){ int 分钟;尝试 { String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );分钟 = Integer.valueOf( s ); } catch ( RuntimeException e ) { 分钟 = 24 * 60; LOGGER.warn("不可解析的存储库更新策略 '{}', 假设 '{}:1440'", policy, RepositoryPolicy.UPDATE_POLICY_INTERVAL ); } 返回分钟; }
...其中 lastModified
是一个/每个基础工件的(本地文件)“修改时间戳”。
特别是对于 interval:x
设置:
冒号 : 不是那么严格 - 任何“非空”字符都可以做到(=, , ...)。
负值 x < 0 应该产生“从不”。
间隔:0 我会假设一个“分钟”(0-59 秒或以上......)间隔。
数字格式异常会导致 24 * 60 分钟(~“每天”)。
..参见:DefaultUpdatePolicyAnalyzer、DefaultMetadataResolver#resolveMetadata() 和 RepositoryPolicy
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>
If client-side, how do I configure it?
。这个答案与任何 IDE 功能无关。它是 mvn 唯一的存储库配置。 updatePolicy
是 OP 询问的时间间隔。
就我而言,解决方案很愚蠢:我只是有不正确的依赖版本。
有点相关..我得到
“[错误] 无法在项目 testproject 上执行目标:无法解析项目 myjarname:jar:1.0-0 的依赖项:无法在 http://repo1.maven.org/maven2 中找到 myjarname-core:bundle:1.0-0已缓存在本地存储库中,直到中央的更新间隔已过或强制更新 -> [帮助1] 才会重新尝试解析
此错误是由于意外使用 Maven 3
而不是 Maven 2
而引起的。只是想它可能会节省一些时间,因为我最初的谷歌搜索把我带到了这个页面。
我有同样的错误,(不会重新尝试解决...)但我有不同的要求,因为我的本地存储库中有文件,目前无法远程使用(旧的过时库和内部库),以及我的公司关系系统已关闭,但它们确实存在于我的 .m2 存储库中。
Maven 仍然拒绝构建,产生上述相同的错误。
对于有问题的库,我刚刚删除了相应的文件:
_remote.repositories 示例路径:users\[username]\.m2\[offending jar path]\[versionnumber]\_remote.respositories
知道这些文件仅在本地可用。
注意:长期解决方案,我可能应该让我们以前的 nexus 系统启动并运行,对于那些遗留的 jar,将它们检入到 lib 文件夹下的项目中(或类似的东西)
我遇到了这个问题,this 中提出的全面描述帮助我解决了这个问题。
第二个宣布的问题是我的问题。我使用了一个刚刚添加的第三方存储库,它在我的项目中执行 pom 文件的 repository
部分。我将相同的存储库信息添加到 pluginrepository
以解决此问题。
我在我的私人存储库上上传第三方库时遇到了同样的问题。有时所描述的修复对我有用,但有时它们没有。
我认为问题的根本原因是工件缺少 pom.xml 文件。 (第三方工件的 pom.xml 不是您项目中的 pom.xml)。我假设 Maven 期望每个工件都有一个 pom.xml,因此它可以解决所有工件的依赖关系。有时它可以在没有 pom.xml 的情况下工作,但有时它不能(我没有确定,当它没有时)。
我使用 Nexus3 作为私有存储库。当您上传工件时,您可以选中一个选项来为工件生成 pom.xml 文件。
在我的 settings.xml 中更改 localRepository 路径解决了这个问题
确保您正在寻找的工件存在,如果它在您的本地项目上运行: cd .. cd 项目名称 mvn clean install
然后你将在本地拥有它。
为了更好的做法: mvn clean deploy 这样你就可以再次使用它而不会出现这个问题
不定期副业成功案例分享