使用Maven时,我偶尔会碰到一些我尚未构建或未包含在我的存储库中的第三方存储库中的工件。
我将从Maven客户端收到一条错误消息,提示找不到工件:
未能在
http://myrepo:80/artifactory/repo
中找到org.jfrog.maven.annomojo:maven-plugin-anno:jar:1.4.0缓存在本地存储库中,直到更新间隔才会重新尝试解析已用完MyRepo或强制进行了更新-> [帮助1]
现在, 我了解了这意味着什么, 并且可以简单地使用-U
重新运行我的命令,并且-U
一切正常 。
但是,我发现此错误消息非常不直观,并且正试图让我的同事感到头疼。
我试图弄清楚是否可以修改此update interval
设置。
- 此错误消息中提到的
update interval
是客户端设置还是服务器端设置? - 如果是客户端,如何配置?
- 如果是服务器端,是否有人知道Nexus / Artifactory如何/是否公开这些设置?
#1楼
有点关系..我越来越
“ [错误]无法在项目testproject上执行目标:无法解析项目myjarname:jar:1.0-0的依赖项:无法在
http://repo1.maven.org/maven2
找到myjarname-core:bundle:1.0-0已被缓存在本地存储库中,直到中心的更新间隔过去或强制进行更新-> [帮助1]”,解决方案才会重新尝试
此错误是由于意外使用Maven 3
而不是Maven 2
。 只是想知道这可能会节省一些时间,因为我最初的Google搜索将我带到了此页面。
#2楼
您可以在本地存储库中删除相应的失败工件目录。 而且,您也可以简单地在目标中使用-U
。 它将完成工作。 这适用于Maven3。因此无需降级到Maven 2。
#3楼
如果使用的是Eclipse,请转至Windows->首选项-> Maven,然后取消选中“不自动从远程存储库更新依赖项”复选框。
这也适用于Maven 3。
#4楼
我是怎么得到这个问题的
当我从Eclipse Juno更改为Luna并从SVN回购中检出我的Maven项目时,在构建应用程序时遇到了相同的问题。
我尝试了什么? 我尝试了干净的本地存储库,然后使用-U选项再次更新了所有版本。 但是我的问题仍然存在。
然后我转到窗口->首选项-> Maven->用户设置->并单击本地存储库下的重新索引按钮,然后等待重新索引发生。
就这样,问题就解决了。
#5楼
您需要从存储库中删除所有“ _maven.repositories”文件。
#6楼
该错误有时可能会引起误解。 您可能要检查的2件事:
回购中是否存在实际的依赖关系JAR? 您的错误消息包含要搜索的URL,因此请转到此处,然后浏览至与您的依赖项匹配的文件夹。 有罐子吗? 如果不是,则需要更改依赖性。 (例如,当您应该指向子项目时,您可能指向顶级父级依赖项)
如果罐子存在于远程仓库中,则只需删除本地副本即可。 它将位于.m2 / repository下的主目录(除非您进行了其他配置)(在Linux上,ls -a显示为隐藏)。
#7楼
如果您将Nexus用作代理存储库,则其具有“未找到的缓存TTL”设置,默认值为1440分钟(或24小时)。 降低此值可能会有所帮助(存储库>配置>到期设置)。
请参阅文档以获取更多信息。
#8楼
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>
#9楼
根据设置参考 :
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>
#10楼
基本上发生的是,根据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中
#11楼
虽然您可以使用全新安装(覆盖所有缓存的依赖项)来解决此问题,如@ Sanjeev-Gulgani建议使用mvn -U clean install
全新mvn -U clean install
您也可以简单地删除导致问题的缓存依赖项
mvn dependency:purge-local-repository -DmanualInclude="groupId:artifactId"
有关更多信息,请参见mvn文档 。
#12楼
最后回答标题问题:它是(项目,配置文件或设置)中的(客户端设置)
[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
分钟(〜“每日”)。
..请参阅: DefaultUpdatePolicyAnalyzer , DefaultMetadataResolver#resolveMetadata()和RepositoryPolicy
#13楼
从本地Maven存储库中删除相关的依赖项后,此方法有效
/user/.m2/repository/path
#14楼
就我而言,解决方案是愚蠢的:我只是有不正确的依赖版本。
#15楼
对于Intellij用户,以下对我有用 :
右键点击您的包裹
Maven > Reimport
和
Maven > Generate Sources and Update Folders
#16楼
我有这个问题,所提出的全面描述这帮助我解决这个问题。
第二个宣布的问题是我的问题。 我使用了一个第三方存储库,我刚刚将其添加到了项目中pom文件的repository
部分。 我将相同的存储库信息添加到pluginrepository
以解决此问题。
#17楼
我有一个相关的问题,但Raghuram的回答有所帮助。 (我还没有足够的声誉来投票赞成他的答案)。 我使用的是与NetBeans捆绑在一起的Maven,并且得到了相同的“ ...已缓存在本地存储库中,直到关系的更新间隔过去或强制执行更新-> [[帮助1]”时,才会重新尝试解决问题。
为了解决这个问题,我向自己的设置文件(C:\\ Program Files \\ NetBeans 7.0 \\ java \\ maven \\ conf \\ settings.xml)添加了<updatePolicy>always</updatePolicy>
<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>
#18楼
我以前通过删除本地存储库中相应的无法下载工件目录来解决此问题。 下次我运行maven命令时,再次触发工件下载。 因此,我想说这是一个客户端设置。
连结端(伺服器回购端),这个问题已解决,可设定排程工作。 客户端,正如您已经指出的那样,这是使用-U
完成的。