Коли Maven каже, що "роздільну здатність не буде повторена, поки не пройде інтервал оновлення MyRepo", де вказаний цей інтервал?


587

З maven я час від часу потрапляю на артефакт, який походить від якогось стороннього репо, якого я ще не створив і не включив до свого сховища.

Я отримаю повідомлення про помилку від клієнта Maven, в якому йдеться про те, що артефакт неможливо знайти:

Не вдалося знайти org.jfrog.maven.annomojo: maven-plugin-anno: jar: 1.4.0 в http://myrepo:80/artifactory/repoкешований в локальному сховищі, роздільна здатність не буде повторена, доки не пройде інтервал оновлення MyRepo або не будуть примусові оновлення -> [ Довідка 1]

Тепер я розумію, що це означає, і можу просто заново виконувати свою команду -U, і все зазвичай нормально працює .

Однак я вважаю це повідомлення про помилку вкрай неінтуїтивним і намагаюся пощадити своїх колег деякими головними болями.

Я намагаюся з’ясувати, чи є якесь місце, де я можу змінити це update intervalналаштування.

  1. Це те, update intervalщо згадується в цьому повідомленні про помилку, налаштування на стороні клієнта чи сервера?
  2. Якщо на стороні клієнта, як це налаштувати?
  3. Якщо на стороні сервера, хтось знає, як / якщо Nexus / Artifactory викриває ці налаштування?

11
Я отримав те саме повідомлення про помилку після додавання ще 1 залежності до мого pom.xml. Для мене це явно БУГ. Я не розумію, чому це відбувається! Якщо я додаю залежності до свого проекту і запускаю mvn компіляцію, то він повинен просто завантажити файли jar. Така поведінка - абсолютно нісенітниця!
Роберт Рейз


Я нещодавно пережив це, і після всіх прочитаних відповідей, ще одним додатковим кроком є повторний імпорт проекту в Eclipse (в моєму випадку). Це було занадто дивно, що Eclipse продовжував клопотати мене плагіном, якого немає в моєму pom.xml.
інкогніто,

Важливе питання для мене !! Дякую друже!
Містер Ноді

Для мене виявилося, що конкретне репо було пов’язане з GitHub, і URL перейшов в офлайн (отримуючи 404). Я оновив репо до нашого внутрішнього сервера, і воно спрацювало.
cbmeeks

Відповіді:


286

Я вирішував цю проблему, видаляючи відповідний каталог невдало завантажених артефактів у моє місцеве репо. Наступного разу, коли я запускаю команду maven, завантаження артефактів знову запускається. Тому я б сказав, що це налаштування на стороні клієнта.

Сторона Nexus (сторона репорта сервера), ця проблема вирішена налаштуванням запланованої задачі. Сторона клієнта, це робиться за допомогою -U, як ви вже вказували.


7
"Я використовую для вирішення цього питання, видаляючи відповідний каталог невдало завантажених артефактів у моєму місцевому репо." Це працювало для мене. Я також використовую Netbeans.

16
Якщо Мейвен зазначає, що кешований артефакт недійсний, то чому він не може вирішити це самостійно?
Стефан

1
що означає "налаштування запланованої задачі" і "це робиться за допомогою -U", чи можете ви, будь ласка, ввести їх у об'єктивні умови Eclipse UI?
користувач2568374

1
Я припускаю, що ви маєте на увазі Eclipse IDE. Теорія полягає в тому, що вам потрібно завантажити найновіший SNAPSHOT. Для цього вам потрібно додати параметр '-U' до вашої команди maven, наприклад mvn clean compile -U. Тепер ви можете запустити цю команду Maven або через командний рядок, або через Eclipse, поставивши галочку "завжди оновлювати знімок". Не впевнений, я використовую Intellij в наші дні. Частина "Налаштування запланованої задачі" стосується певної конфігурації, яку ви хочете мати на своєму сервері Nexus. Це останнє не має нічого спільного з Eclipse як таким.
Крістіан Ахіллі

10
Це не відповідає дійсному питанню ОП.
8bitjunkie

116

Ви можете видалити відповідний каталог невдалих артефактів у вашому локальному сховищі. А також ви можете просто використовувати -Uв цілі. Це зробить роботу. Це працює з maven 3. Тому не потрібно переходити на Maven 2.


2
Чому возитися з конфігурацією сховища, коли це може бути так просто?
Корактор

9
Будь ласка, уважно прочитайте питання, перш ніж відповісти. ОП запитує, як встановити часовий інтервал, а не як примусити оновлення.
i3ensays

2
Не відповідь на питання, але це те, що потрібно людям, коли вони потрапляють у цей виняток. Тому що, коли ви працюєте над локальною розробкою, найкраще видалити таку, а не дозволяти інтервалу заплутати вас.
mcvkr

У нас повинні бути додані дійсні сховища, ~/.m2/settings.xml/<repositories>щоб вирішити цю проблему за допомогою параметрів -U
Kanagavelu Sugumar

64

У мене була пов’язана проблема, але відповідь Рагурама допомогла. (У мене ще недостатньо репутації, щоб проголосувати його відповідь). Я використовую Maven в комплекті з NetBeans і отримував те саме "... був кешований у локальному сховищі, роздільна здатність не буде повторно використана, поки не пройде інтервал оновлення 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>

8
Не допомогло в моєму випадку.
arcy

64

Що в основному відбувається, це за замовчуванням updatePolicy maven.Maven щодня виймає банки з репо. Так, якщо під час першої спроби ваш Інтернет не працював, то він не намагатиметься отримати цю банку ще до 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>

у ваших налаштуваннях.xml


39

Відповідно до посилань на налаштування :

updatePolicy: Цей елемент визначає, як часто слід намагатися відбуватись оновлення. Maven порівняє часову позначку локальної POM (зберігається у файлі метаданних Maven-сховища) з віддаленою. Вибір: завжди, щодня (за замовчуванням), інтервал: 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>

7
Дякую за відповідь; однак я досить експериментував із налаштуванням "updatePolicy", і, здається, це не вплине на помилку "Не знайдено" / "Не вдалося кешувати" / "Розв'язання не буде повторно спробовано".
cprice404

23

Хоча ви можете вирішити це за допомогою чистої установки (перекриття будь-яких кешованих залежностей), як пропонує @ Sanjeev-Gulgani з mvn -U clean install

Ви також можете просто видалити кешовану залежність, яка викликає проблему

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

Докладнішу інформацію див. У документах mvn .


9

Ця помилка іноді може вводити в оману. 2 речі, які ви можете перевірити:

  1. Чи існує фактичний JAR для залежності в репо? Ваше повідомлення про помилку містить URL-адресу, де його шукають, тому перейдіть туди, а потім перейдіть до папки, яка відповідає вашій залежності. Є баночка? Якщо ні, то вам потрібно змінити свою залежність. (наприклад, ви можете вказувати на батьківську залежність вищого рівня, коли вам слід вказувати на підпроект)

  2. Якщо баночка існує на віддаленому репо, просто видаліть локальну копію. Це буде у вашому домашньому каталозі (якщо ви не налаштовані по-іншому) під .m2 / repository (ls -a, щоб показати приховано, якщо в Linux).


4
Це не стосується питання ОП. Причина, по якій відображається помилка, не в цьому. ОП хоче знати, як встановити інтервал повтору.
8bitjunkie

1
Це може бути неявна проблема, яка стоїть за посадою ОП, і виявилася моєю проблемою. Виявилося, у мого <groupId> була помилка друку, яка, переглядаючи варіант 1, привела мене до правильного шляху.
Джеймс Оравець

1
Питання в тому, як встановити інтервал?
smilyface

7

Якщо ви використовуєте Eclipse, перейдіть до Windows -> Preferences -> Maven та зніміть прапорець "Не оновлювати автоматично залежності залежностей від віддалених сховищ".

Це працює і з Maven 3.


1
перевірено: eclipse: Juno Service Release 2. m2e: v 1.3.1
user77115

8
Це не відповідає на питання ОП.
8bitjunkie

5

Вам потрібно видалити всі файли "_maven.repositories" зі свого сховища.


3
не допомагає або, принаймні, не в моєму випадку
arcy

1
Це працювало для мене. Я не видалив їх усіх, але лише той, що знаходиться в тій конкретній папці залежностей
Piyin

5

Це працює після того, як ви видалите відповідну залежність зі свого місцевого сховища Maven

/user/.m2/repository/path

Це працює як принадність
Джадда

3

Якщо ви використовуєте Nexus як проксі-репо, він має налаштування "Не знайдено кеш-пам'ять TTL" зі значенням за замовчуванням 1440 хвилин (або 24 години). Зниження цього значення може допомогти (сховища> конфігурація> налаштування терміну дії).

Докладнішу інформацію див. У документації .


2

Як я отримав цю проблему,

Коли я перейшов із Eclipse Juno на Luna і перевірив свої проекти Maven від SVN repo, у мене виникли ті самі проблеми під час створення програм.

Що я спробував? Я спробував очистити локальний сховище, а потім знову оновив усі версії за допомогою параметра -U. Але моя проблема тривала.

Потім я зайшов у вікно -> Налаштування -> Maven -> Налаштування користувача -> і натиснув кнопку Reindex під Local Repository та чекаю, коли відбудеться повторне вимкнення.

Ось і все, питання вирішено.


4
Це не відповідає на питання ОП.
8bitjunkie

2

Нарешті, щоб відповісти на головне запитання: Це (налаштування на стороні клієнта) у (проект, профіль чи налаштування)

[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 # resolutionMetadata () та RepositoryPolicy


1

Для Intellij користувачів для мене працювали такі:

Клацніть правою кнопкою миші на вашому пакеті

Maven > Reimport 

і

Maven > Generate Sources and Update Folders

0

Дещо спокійно .. Я отримував

"[ПОМИЛКА] Не вдалося виконати ціль на тестовому проекті проекту: Не вдалося вирішити залежності для myjarname проекту: jar: 1.0-0: Не вдалося знайти myjarname-core: bundle: 1.0-0 in http://repo1.maven.org/maven2було кешовано в локальному сховищі, роздільної здатності не буде повторне намагання, поки не пройде інтервал оновлення центрального або примусові оновлення -> [Довідка 1] "

Ця помилка була викликана випадковим використанням Maven 3замість Maven 2. Просто подумав, що це може врятувати когось деякий час, тому що мій початковий пошук в Google переніс мене на цю сторінку.


2
Що робити, якщо ваш проект змушує вас використовувати Maven 3? Чи є у вас підказки щодо того, що змінилося між двома версіями?
Xr.

1
Саме в цьому і полягала моя проблема. Не маю уявлення, чому Maven 3 настільки відрізняється від 2. Дякую, що ви розмістили це питання і врятуєте мене не витрачати більше часу на пошук рішення.
CatsAndCode

як встановити maven2 замість maven3?
трильйони

Дуже загальне питання .. яка операційна система? Для Ubuntu ви можете зробити "sudo apt-get install maven2" ... або для будь-якого Linux / UNIX, ви можете просто завантажити архів і скласти його самостійно, додавши його у свій шлях. Спробуйте: sramerarathnayaka.blogspot.com/2012/01/…
sdanzig

Це працювало на мене, і я фактично посилаюся на це зі своєї відповіді тут .
ширі

0

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>

3
Це не відповідає на питання ОП. ОП зрозуміло, що вони розуміють, в чому проблема, і як оновити своє локальне сховище м2. ОП запитує, де знаходиться інтервал і як його змінити. Тут взагалі не згадується жодна IDE. Ви не читали питання.
8bitjunkie

@ 8bitjunkie Це дає відповідь зовсім безпосередньо питання: If client-side, how do I configure it?. Ця відповідь не стосується жодної функції IDE. Це лише конфігурація сховища mvn. Це updatePolicyінтервал, про який задається ОП.
montrivo

Це може бути прийнята відповідь @ cprice404.
montrivo


0

У мене була ця проблема і вичерпні описи, запропоновані в цьому допоміг мені виправити це.

Другою заявленою проблемою було моє питання. Я використав стороннє сховище, яке я тільки що додав, і є repositoryчастиною файлу pom у своєму проекті. Я додаю ту саму інформацію сховища, pluginrepositoryщоб вирішити цю проблему.


0

У мене була подібна помилка з іншим артефактом.

<...> було збережено в кешованому сховищі, роздільна здатність не буде повторена, доки не пройде інтервал оновлення центрального або примусові оновлення

Жодне з описаних вище рішень не працювало для мене. Нарешті я вирішив це в IntelliJ IDEA за допомогою Файл> Недійсний кеш / Перезапуск ...> Недійсний та перезапуск .


0

У моєму випадку у мене було кілька проектів

rootProject
 |-> contractProject (using Project Lombok)
 |-> domainProject (dependency on contractProject)

Коли я зробив "mvn clean install" з каталогу "domainProject", я отримав би помилку.

Коли я зробив "mvn clean install" з каталогу "projectRoot", проблема пішла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.