当Maven说“在MyRepo的更新间隔过去之前不会重试解析”时,这个间隔是在哪里指定的?

kx7yvsdv  于 2022-09-20  发布在  Maven
关注(0)|答案(24)|浏览(628)

使用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是客户端设置还是服务器端设置?
1.如果是客户端,如何配置?
1.如果是服务器端,有人知道Nexus/ArtiFactory如何/是否公开这些设置吗?

t3psigkw

t3psigkw1#

我过去常常通过删除本地repo中相应的失败下载构件目录来解决这个问题。下次运行maven命令时,将再次触发构件下载。因此,我会说这是一个客户端设置。

Nexus端(服务器回购端),配置计划任务解决了这个问题。客户端,这是使用-U完成的,正如您已经指出的。

lskq00tm

lskq00tm2#

基本上发生的是,根据Maven.Maven的默认更新策略。Maven将每天从repo中获取jar。因此,如果在第一次尝试期间您的互联网不工作,那么它不会再次尝试获取这个jar,直到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中

nwwlzxa7

nwwlzxa73#

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

k97glaaz

k97glaaz4#

我有一个相关的问题,但拉古拉姆的回答有帮助。(我还没有足够的声誉来支持他的答案)。我正在使用与NetBeans捆绑在一起的Maven,并收到相同的错误:“...已缓存在本地存储库中,解析将不会重试,直到nexus的更新间隔已过或强制更新->[Help 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>
1qczuiv0

1qczuiv05#

虽然您可以像@Sanjeev-Gulgani用mvn -U clean install建议的那样,通过全新安装(覆盖任何缓存的依赖项)来解决这个问题

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

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

有关详细信息,请参阅mvn docs

eivgtgni

eivgtgni6#

根据设置reference

**updatePolicy:**此元素指定应该尝试进行更新的频率。Maven会将本地POM的时间戳(存储在存储库的maven元数据文件中)与远程POM进行比较。选项包括:Always、Daily(默认)、Interval:X(其中X为分钟整数)或Never。

示例:

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

kulphzqa7#

在从本地maven存储库中删除相关依赖项后,此操作将起作用

/user/.m2/repository/path
qlfbtfca

qlfbtfca8#

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

1.回购中的依赖项是否有实际的JAR?您的错误消息包含搜索位置的URL,因此请转到此处,然后浏览到与您的依赖项匹配的文件夹。有jar吗?如果不是,则需要更改依赖项。(例如,当您应该指向子项目时,您可以指向顶级父依赖项)
1.如果远程Repo上存在JAR,则只需删除您的本地副本。它将位于您的主目录中(除非您进行了不同的配置),位于.m2/store(ls-a,如果在Linux上则显示隐藏)下。

f87krz0w

f87krz0w9#

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

这也适用于Maven 3。

f5emj3cl

f5emj3cl10#

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

zzwlnbp8

zzwlnbp811#

我对另一件艺术品也犯了类似的错误。
已在本地存储库中缓存,在已过中心的更新间隔或强制更新之前,将不会重试解析.

上面描述的解决方案对我来说都不起作用。我最终在IntelliJ Idea中通过文件>无效缓存/重新启动...>无效并重新启动解决了这个问题。

vsaztqbk

vsaztqbk12#

对于IntelliJ用户,以下方法对我有效:

右键单击您的包

Maven > Reimport

Maven > Generate Sources and Update Folders
at0kjp5o

at0kjp5o13#

如果您使用Nexus作为代理回购,则它会使用缺省值1440分钟(或24小时)的“Not Found Cache TTL”设置。降低此值可能会有所帮助(存储库>配置>过期设置)。

有关详细信息,请参阅documentation

7hiiyaii

7hiiyaii14#

我是怎么遇到这个问题的,

当我从Eclipse Juno更改为露娜,并从SVN repo checkout 我的maven项目时,我在构建应用程序时遇到了同样的问题。

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

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

仅此而已,问题解决了。

fcg9iug3

fcg9iug315#

最后回答标题问题:它在(项目、个人资料或设置)中(客户端设置)

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

..请参阅:DefaultUpdatePolicyAnalyzer、DefaultMetadataResolver#solveMetadata()和RepositoryPolicy

相关问题