Когда 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 установка.

  1. Это update interval что упоминается в этом сообщении об ошибке на стороне клиента или на стороне сервера?
  2. Если на стороне клиента, как я могу настроить это?
  3. Если на стороне сервера, кто-нибудь знает, как / если Nexus/Artifactory выставляет эти настройки?

29 ответов

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

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

Что в основном происходит, так это то, что по умолчанию 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

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

У меня была связанная проблема, но ответ Рагурама помог. (У меня пока недостаточно репутации, чтобы проголосовать за его ответ). Я использую 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>

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

mvn -U clean install

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

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

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

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

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>

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

/user/.m2/repository/path

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

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

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

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

Это работает и с Maven 3.

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

У меня была аналогичная ошибка с другим артефактом.

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

Ни одно из описанных выше решений не помогло мне. Я, наконец, решил это в IntelliJ IDEA, выбрав Файл> Недействительные кеши / перезапуск...> Недействительность и перезапуск.

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

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

Maven > Reimport 

а также

Maven > Generate Sources and Update Folders

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

Смотрите документацию для получения дополнительной информации.

Чтобы окончательно ответить на заглавный вопрос: Это (настройка на стороне клиента) в (проект, профиль или настройки)

[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 минут (~"ежедневно").

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

В Затмении:

  • Щелкните правой кнопкой мыши Project -> Run As -> Maven Build -> Укажите цель как "чистая установка" - >> Необходимые артефакты будут загружены в локальный репозиторий.
  • - >> Когда построить УСПЕХ!! -> Щелкните правой кнопкой мыши Project-> Maven -> Обновить проект (отметьте галочкой).

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

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

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

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

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

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

Я решил это!

Я столкнулся с этой проблемой ранее, и после просмотра некоторых комментариев это сработало. нам нужно только исправить файл settings.xml в {m2_home}/.m2

      **<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>.m2/repository</localRepository>
<profiles>
    <profile>
      <repositories>
        <repository>
          <id>projectid</id>
          <url>http://localhost</url>
          <name>Project name</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
         </repository>
      </repositories>
    </profile>
  </profiles>
</settings>**

и выполните команду maven clean install.

      **/maven_home/mvn -f project_directory/pom.xml -DskipTests clean install**

У меня была та же ошибка (разрешение не будет повторено...), но у меня были другие требования, так как у меня есть файлы в моем локальном репозитории, которые в настоящее время недоступны удаленно (старые устаревшие библиотеки и внутренние библиотеки), и связь моей компании система не работает, но они существуют в моих репозиториях .m2.

Maven по-прежнему отказывался строить, выдавая ту же ошибку, что и выше.

Для оскорбительных библиотек я просто удалил соответствующий файл:

_remote.repositories

Пример пути: пользователи\[имя пользователя]\.m2\[путь оскорбительного jar]\[номер версии]\_remote.respositories

зная, что эти файлы доступны только локально.

Примечание. В долгосрочной перспективе мне, вероятно, следует запустить и запустить нашу предыдущую систему Nexus, а для тех jar-файлов, которые являются устаревшими, зарегистрировать их в проекте в папке lib (или что-то в этом роде)

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

"[ОШИБКА] Не удалось выполнить цель в тестовом проекте проекта: Не удалось разрешить зависимости для проекта myjarname:jar:1.0-0: Ошибка при поиске myjarname-core:bundle:1.0-0 в http://repo1.maven.org/maven2 был кэширован в локальном репозитории, разрешение не будет предприниматься повторно, пока не истечет интервал обновления центрального сервера или принудительные обновления -> [Help 1]"

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

Перейдите к файлу Pom, щелкните правой кнопкой мыши и прокрутите вниз, затем нажмите maven, чтобы открыть файл settings.xml (как вы видите на изображении), и добавьте следующий код (в файл settings.xml), затем сохраните, закройте и подождите. чтобы maven перезагрузился.

       <mirrors>
   <mirror>
     <id>my-mirror</id>
       <url>https://repo.maven.apache.org/maven2/</url>
     <mirrorOf>central</mirrorOf>
 </mirror>
</mirrors>

Затем обновите/перезагрузите файл/проект pom.

N:B Возможно, вам придется перейти к основному классу загрузки Spring и Hoover поверх @SprinBootApplication, а затем нажать на предложение добавить зависимость Maven...

Это переустановит ваши локальные зависимости maven, которые вы, вероятно, потеряли.

У меня была эта проблема, и исчерпывающие описания, предложенные в ней, помогли мне ее исправить.

Вторая заявленная проблема была моей проблемой. Я использовал сторонний репозиторий, который я только что добавил,repositoryчасть файла pom в моем проекте. Я добавляю ту же информацию о репозитории вpluginrepository чтобы решить эту проблему.

Я столкнулся с теми же проблемами с загруженными сторонними библиотеками в моем частном репозитории. Иногда описанные исправления у меня работали, а иногда нет.

Я думаю, что основная причина проблемы - это отсутствие файла pom.xml для артефакта. (Pom.xml для стороннего артефакта, а не ваш pom.xml в вашем проекте). Я предполагаю, что Maven ожидает от каждого артефакта файла pom.xml, поэтому он может разрешить зависимости для всех артефактов. Иногда он работает без pom.xml, но иногда нет (я не определил, когда это не так).

Я использую Nexus3 как частный репозиторий. Когда вы загружаете артефакт, вы можете выбрать опцию создания файла pom.xml для артефакта.

Я пробовал следующие решения, но ни одно из них мне не помогло (со встроенным в eclipse maven):

  • удаление файлов из папки репозитория
  • добавление зеркала в settings.xml
  • добавление профиля с помощью updatePolicy=always в settings.xml

Я видел многие из этих решений с большим количеством голосов «за», но они довольно старые, поэтому я думаю, что когда-то они работали, но в настоящее время они больше не действительны (по крайней мере, для встроенного в Eclipse Maven).

Что сработало для меня:

в Eclipse перейдите в «Окно» > «Настройки» > Maven и установите для поля «Глобальная политика обновления» значение «Всегда».

Изменение пути localRepository в моем settings.xml решило проблему

Убедитесь, что артефакт, который вы ищете, существует, если он находится в вашем локальном проекте, запустите:cd ..cd имя проекта mvn clean install

Тогда он будет у вас локально.

для лучшей практики выполните:mvn clean deploy, чтобы вы могли использовать его снова без этой проблемы

Для меня URL-адрес репо был неправильным, после того, как я его исправил, он работал ...

Проверьте настройки зеркала в файле settings.xml. Возможно, местоположение зеркала находится далеко от вашего домена и недоступно. Попробуйте выбрать зеркала ближе к вашему хосту. Попробуйте использовать зеркала ниже

 <mirror>
        <id>repo.exist.com</id>
        <url>http://repo.exist.com/maven2</url>
    </mirror>
    <mirror>
        <id>ibiblio.org</id>
        <url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>
    </mirror>
    <mirror>
        <id>ibiblio.net</id>
        <url>http://www.ibiblio.net/pub/packages/maven2</url>
    </mirror>
    <!--mirror>
        <id>mirror.netcologne.de</id>
        <url>http://mirror.netcologne.de/maven2</url> 
    </mirror -->
    <mirror>
        <id>uk.maven.org</id>
        <url>http://uk.maven.org/maven2</url>
    </mirror>

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

Другие вопросы по тегам