Когда maven говорит, что "разрешение не будет повторно загружено до истечения интервала обновления MyRepo", где указан этот интервал?

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

Я получаю сообщение об ошибке от клиента maven, говоря, что артефакт не найден:

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

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

Тем не менее, я считаю, что это сообщение об ошибке крайне неинтуитивно, и я пытаюсь избавить своих сотрудников от некоторых головных болей.

Я пытаюсь выяснить, есть ли какое-то место, где я могу изменить этот параметр update interval.

  • Указывается ли update interval в этом сообщении об ошибке на стороне клиента или на стороне сервера?
  • На клиентской стороне, как его настроить?
  • Если на стороне сервера кто-нибудь знает, как/если Nexus/Artifactory выставляют эти настройки?

Ответ 1

Я использовал эту проблему, удалив соответствующий файл, чтобы загрузить каталог артефактов в моем локальном репо. В следующий раз, когда я запустил команду maven, загрузка артефакта будет снова запущена. Поэтому я бы сказал, что это настройка на стороне клиента.

Сторона Nexus (сторона сервера репо), эта проблема решается при настройке запланированной задачи. Клиент, это делается с помощью -U, как вы уже указали.

Ответ 2

вы можете удалить соответствующий каталог артефактов в локальном репозитории. А также вы можете просто использовать -U в цели. Он будет выполнять эту работу. Это работает с maven 3. Поэтому не нужно понижать до maven 2.

Ответ 3

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

Ответ 4

Что в основном происходит, так это то, что по умолчанию updatePolicy от maven.Maven будет извлекать баночки из репо ежедневно. Так что, если во время 1-й попытки ваш интернет не работал, он не будет пытаться получить эту банку снова, пока не потрачено 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

Ответ 5

Согласно справке настроек:

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

Ответ 6

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

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

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

Для получения дополнительной информации см. mvn docs.

Ответ 7

Эта ошибка иногда может вводить в заблуждение. 2 вещи, которые вы можете проверить:

  • Существует ли реальная JAR для зависимости в репо? В вашем сообщении об ошибке содержится URL-адрес, где он выполняется, идите туда, а затем перейдите в папку, соответствующую вашей зависимости. Есть ли баночка? Если нет, вам нужно изменить свою зависимость. (например, вы могли бы указывать на родительскую зависимость верхнего уровня, когда вы должны указывать на суб-проект)

  • Если банка существует в удаленном репо, просто удалите локальную копию. Он будет находиться в вашем домашнем каталоге (если вы не настроены по-разному) в .m2/repository (ls -a показать скрытый, если в Linux).

Ответ 8

Если вы используете Eclipse, перейдите в Windows → Preferences → Maven и снимите флажок "Не устанавливать обновления для удаленных репозиториев".

Это также работает с Maven 3.

Ответ 9

Вам нужно удалить все файлы "_maven.repositories" из вашего репозитория.

Ответ 10

Если вы используете Nexus в качестве репозитория прокси, у него есть параметр "Not Found Cache TTL" со значением по умолчанию 1440 минут (или 24 часа). Уменьшение этого значения может помочь (Хранилищa > Конфигурация > Настройки срока действия).

Подробнее см. .

Ответ 11

Это работает после удаления связанной зависимости из локального репозитория maven

/user/.m2/repository/path

Ответ 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;
}

..с:

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 Я бы предположил, что interval:0 "минутно" (0-59 секунд или выше...).
  • исключения числового формата приводят к 24 * 60 минутам (~ "ежедневно").

..see: DefaultUpdatePolicyAnalyzer, DefaultMetadataResolver # resolMetadata() и RepositoryPolicy

Ответ 13

Как я получил эту проблему,

Когда я перешел из Eclipse Juno в Luna и проверил мои проекты maven из репо SVN, у меня возникли те же проблемы при создании приложений.

Что я пробовал?  Я попробовал очистить локальный репозиторий, а затем снова обновил все версии, используя опцию -U. Но моя проблема продолжалась.

Затем я перешел в Window → Preferences → Maven → User Settings → и нажал кнопку Reindex в локальном репозитории и дождался, когда произойдет переиндекса.

Что все, проблема решена.

Ответ 14

В моем случае решение было глупым: у меня просто были неправильные версии зависимостей.

Ответ 15

Для Intellij пользователей у меня сработало следующее:

Щелкните правой кнопкой мыши на вашей посылке

Maven > Reimport 

и

Maven > Generate Sources and Update Folders

Ответ 16

Несколько уместно.. Я получал

"[ERROR] Не удалось выполнить цель в проекте testproject: не удалось разрешить зависимости для проекта myjarname: jar: 1.0-0: Не удалось найти myjarname-core: bundle: 1.0-0 in http://repo1.maven.org/maven2 был кеширован в локальном репозиторий, разрешение не будет повторно загружено до тех пор, пока не истечет интервал обновления центрального элемента или не будет принудительно обновлено обновление → [Справка 1]"

Эта ошибка была вызвана случайным использованием Maven 3 вместо Maven 2. Просто подумал, что это может сэкономить некоторое время, потому что мой первоначальный поиск в Google привел меня на эту страницу.

Ответ 17

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>

Ответ 18

эта проблема путала меня на один день. Я решил это, проверив локальное расположение репозитория. Я использовал IntelliJ в качестве моей IDE, и я нашел локальный репозиторий maven по умолчанию: "C:/Users/.m2/repository". Я изменил его на свой собственный путь, и проблема была решена.