web-dev-qa-db-ja.com

Mavenが「MyRepoの更新間隔が経過するまで解決は再試行されません」と言った場合、その間隔はどこで指定されますか?

Mavenを使って、私は時々、私がまだ私のリポジトリに構築していないか、まだ含んでいないサードパーティレポジトリから来たアーティファクトを見つけました。

アーティファクトが見つからないというMavenクライアントからのエラーメッセージが表示されます。

http://myrepo:80/artifactory/repoのorg.jfrog.maven.annomojo:maven-plugin-anno:jar:1.4.0がローカルリポジトリにキャッシュされていないため、MyRepoの更新間隔が経過するか更新が強制されるまで解決は再試行されません - > [ヘルプ1]

さて、 _ i _ これが何を意味するのか理解してください、 そして-Uを付けて私のコマンドを再実行すれば、通常そこからうまくいくでしょう

しかし、私はこのエラーメッセージが非常に直感的ではないと思い、同僚たちに頭痛の種をいくつか与えようとしています。

私はこのupdate interval設定を変更できる場所があるかどうか把握しようとしています。

  1. このエラーメッセージに記載されているupdate intervalは、クライアント側またはサーバー側のどちらの設定ですか?
  2. クライアントサイドの場合、どのように設定しますか?
  3. サーバーサイドの場合、誰かがNexus/Artifactoryがこれらの設定をどのように公開するかを知っていますか?
460
cprice404

私はローカルレポジトリでダウンロードに失敗したアーティファクトディレクトリを削除することでこの問題を解決していました。次回mavenコマンドを実行すると、アーティファクトのダウンロードが再度トリガーされます。したがって、私はそれがクライアント側の設定だと思います。

Nexus側(サーバーリポジトリ側)では、この問題はスケジュールされたタスクの設定で解決されています。クライアント側では、すでに指摘したように、これは-Uを使って行われます。

227

ローカルリポジトリ内の対応する失敗したアーティファクトディレクトリを削除できます。また、目標に-Uを使用することもできます。それは仕事をするでしょう。これはmaven 3で動作します。したがって、maven 2にダウングレードする必要はありません。

101
kds

私は関連した問題を抱えていました、しかし、Raghuramの答えは助けました。 (私は彼の答えを投票するのに十分な評判を得ていない)。 NetBeansにバンドルされているMavenを使用していますが、「...はローカルリポジトリにキャッシュされました。ネクサスの更新間隔が経過するか更新が強制されるまで解決は再試行されません - > [ヘルプ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>
58
MrDrews

基本的に起こることは、maven.MavenのデフォルトのupdatePolicyによると、毎日リポジトリからjarファイルを取得するでしょう。

解決 :

どちらでも

mvn -U clean install

where -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に

32
Sanjeev Guglani

設定によると 参照

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>
32
Raghuram

Eclipseを使用している場合は、[ウィンドウ] - > [設定] - > [Maven]の順に選択し、[リモートリポジトリから依存関係を自動的に更新しない]チェックボックスをオフにします。

これはMaven 3でも機能します。

8
ashoka

このエラーは時々誤解を招く可能性があります。あなたがチェックしたいと思うかもしれない2つのこと:

  1. リポジトリ内の依存関係に対する実際のJARはありますか?エラーメッセージには検索場所のURLが含まれているので、そこに移動して、依存関係に一致するフォルダを参照します。瓶はありますか?そうでない場合は、依存関係を変更する必要があります。 (たとえば、サブプロジェクトを指す必要があるときは、最上位の親依存関係を指すことができます)

  2. Jarファイルがリモートリポジトリに存在する場合は、ローカルコピーを削除してください。これは.m2/repository(Linuxの場合は非表示にするにはls -a)の下のホームディレクトリにあります(別の方法で設定した場合を除く)。

8
MattC

リポジトリからすべての "_maven.repositories"ファイルを削除する必要があります。

6
Riadh

@ Sanjeev-Gulganiが示唆しているように、これをクリーンインストール(キャッシュされた依存関係を上書き)で解決できます。

mvn -U clean install

また、単に問題を引き起こしているキャッシュされた依存関係を削除することもできます。

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

詳細は mvn docs を参照してください。

4
sfletche

プロキシレポジトリとしてNexusを使用している場合は、デフォルト値1440分(または24時間)で「キャッシュが見つかりませんTTL」が設定されています。この値を小さくすると効果があります(「リポジトリー」>「構成」>「有効期限設定」)。

詳しくは ドキュメント を参照してください。

2
chipiik

どうやってこの問題を解決したのか

Eclipse JunoからLunaに変更し、そして私が作ったプロジェクトをSVNリポジトリからチェックアウトしたとき、私はアプリケーションを構築している間に同じ問題を抱えていました。

私が試したこと私はきれいなローカルリポジトリを試してから、-Uオプションを使用してすべてのバージョンを更新しました。しかし私の問題は続いた。

それから私はWindow - > Preferences - > Maven - > User Settings - >の順に進み、Local Repositoryの下のReindexボタンをクリックして、インデックスが再作成されるのを待ちます。

これですべて、問題は解決しました。

2
Lyju I Edwinson

これは、ローカルMavenリポジトリから関連する依存関係を削除した後に機能します

/user/.m2/repository/path
1
Pravin

やや無関心です。

"[エラー]プロジェクトtestprojectで目的の実行に失敗しました。プロジェクトmyjarnameの依存関係を解決できませんでした:jar:1.0-0:http://repo1.maven.org/maven2内のmyjarname-core:bundle:1.0-0がローカルリポジトリにキャッシュされませんでした。 centralの更新間隔が経過するか更新が強制されるまで再試行されます - > [Help 1] "

このエラーは、Maven 3の代わりにMaven 2を誤って使用していたために発生しました。最初のGoogle検索でこのページが表示されたため、時間を節約できる可能性があることを考え出してください。

0
sdanzig

最後にタイトルの質問に答えるには:(プロジェクト、プロファイル、または設定)の(クライアント側の設定)です

[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は "never"になります。
  • interval:0私は "毎分"(0-59秒以上)の間隔を想定しています。
  • 数値フォーマットの例外は24 * 60分(〜 "daily")になります。

..see: DefaultUpdatePolicyAnalyzerDefaultMetadataResolver#resolveMetadata() および RepositoryPolicy

0
xerx593