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

587

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

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

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

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

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

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

  1. Является ли update intervalупомянутое в этом сообщении об ошибке настройкой на стороне клиента или на стороне сервера?
  2. Если на стороне клиента, как я могу настроить это?
  3. Если на стороне сервера, кто-нибудь знает, как / если Nexus / Artifactory выставляет эти настройки?
cprice404
источник
11
Я получил то же сообщение об ошибке после добавления еще 1 зависимости в мой pom.xml. Для меня это явно ошибка. Я не понимаю, почему это происходит! Если я добавляю зависимости в свой проект и запускаю mvn compile, он должен просто загрузить файлы jar. Такое поведение - полная чушь!
Роберт Рейз
2
Связанный stackoverflow.com/questions/4701532/force-maven-update
Пол Верест
Я только недавно испытал это, и после всех ответов, которые я прочитал, еще одним дополнительным шагом является повторный импорт проекта в Eclipse (в моем случае). Было слишком странно, что Eclipse продолжал заставлять меня плагином, которого нет в моем pom.xml.
Инкогнито
Важный вопрос для меня! Спасибо, приятель!
Мистер Нодди
Для меня оказалось, что определенный репозиторий был связан с GitHub и URL-адрес отключился (получая 404). Я обновил репо на наш внутренний сервер, и он заработал.
cbmeeks

Ответы:

286

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

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

Кристиан Ахилли
источник
7
«Я использую для решения этой проблемы, удалив соответствующий не удалось загрузить каталог артефактов в моем локальном репо». Это сработало для меня. Я также использую Netbeans.
16
Если Maven отмечает, что кэшированный артефакт недействителен, почему он не может решить это самостоятельно?
Стефан
1
что означает «настройка запланированной задачи» и «это делается с помощью -U», не могли бы вы указать это в объективных терминах Eclipse UI?
user2568374
1
Я предполагаю, что вы имеете в виду Eclipse IDE. Теория заключается в том, что вам нужно скачать последнюю версию SNAPSHOT. Для этого вам нужно добавить параметр '-U' в команду maven, например, mvn clean compile -U. Теперь вы можете запустить эту команду maven либо из командной строки, либо через Eclipse, установив флажок «всегда обновлять снимок». Не уверен, я использую intellij в эти дни. Часть «Настройка запланированной задачи» относится к конкретной конфигурации, которую вы хотите иметь на своем сервере Nexus. Последнее не имеет ничего общего с Eclipse как таковым.
Кристиан Ахилли
10
Это не отвечает на действительный вопрос ОП.
8bitjunkie
116

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

KDS
источник
2
Зачем возиться с конфигурацией хранилища, когда это может быть так просто?
Koraktor
9
Пожалуйста, внимательно прочитайте вопрос, прежде чем ответить. ОП спрашивает, как установить временной интервал, а не как форсировать обновление.
i3ensays
2
Не ответ на вопрос, но это то, что нужно людям, когда они попадают в это исключение. Потому что, когда вы работаете над локальной библиотекой, лучше всего удалить такую ​​библиотеку, а не позволить интервалу сбить вас с толку.
mcvkr
У нас должны быть добавлены действительные репозитории, ~/.m2/settings.xml/<repositories>чтобы решить эту проблему с опциями -U
Kanagavelu Sugumar
64

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

По сути, происходит следующее: по умолчанию 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

Санджив Гуглани
источник
39

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

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>
Raghuram
источник
7
Спасибо за ответ; однако я довольно много экспериментировал с параметром «updatePolicy», и, похоже, он не влияет на ошибку «Not Found» / «Failure Cached» / «не будет повторной попытки».
cprice404
23

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

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

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

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

sfletche
источник
9

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

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

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

MattC
источник
4
Это не относится к вопросу ОП. Причина, по которой отображается ошибка, не в этом дело. ОП хочет знать, как установить интервал повторных попыток.
8bitjunkie
1
Это может быть косвенной проблемой, стоящей за постом ОП, и она оказалась моей проблемой. Оказалось, что в моем <groupId> была опечатка, которая, рассмотрев первый вариант, привела меня к правильному пути.
Джеймс
1
Вопрос в том, как установить интервал?
Smilyface
7

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

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

Ашока
источник
1
проверено: eclipse: сервисный выпуск Juno 2. m2e: v 1.3.1
user77115
8
Это не отвечает на вопрос ОП.
8bitjunkie
5

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

Риад
источник
3
не помогает, или, по крайней мере, не в моем случае
Arcy
1
Это сработало для меня. Я не удалил их все, хотя, только один в этой конкретной папке зависимостей
Piyin
5

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

/user/.m2/repository/path
Pravin
источник
Это работает как шарм
Jadda
3

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

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

chipiik
источник
2

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

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

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

Затем я зашел в Window -> Preferences -> Maven -> User Settings -> и нажал на кнопку 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минутам (~ "ежедневно").

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

xerx593
источник
1

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

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

Maven > Reimport 

а также

Maven > Generate Sources and Update Folders
Emerica
источник
0

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

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

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

sdanzig
источник
2
Что если ваш проект заставит вас использовать Maven 3? Есть ли у вас какие-либо подсказки относительно того, что изменилось между двумя версиями?
Xr.
1
Это именно то, что было моей проблемой. Понятия не имею, почему Maven 3 так отличается от 2. Спасибо, что опубликовали это и избавили меня от лишних затрат времени на поиск решения.
CatsAndCode
как установить maven2 вместо maven3?
триллионы
Очень общий вопрос .. какая операционная система? Для Ubuntu вы можете сделать «sudo apt-get install maven2» ... или для любого Linux / UNIX, вы можете просто скачать архив и скомпилировать его самостоятельно, добавив его по своему пути. Попробуйте: shameerarathnayaka.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
Это не отвечает на вопрос ОП. ОП ясно, что они понимают, в чем проблема и как обновить свой локальный репозиторий m2. ОП спрашивает, где находится интервал и как его изменить. Там нет никакого упоминания о какой-либо IDE на всех. Вы не читали вопрос.
8bitjunkie
@ 8bitjunkie Это дает ответ совершенно непосредственно вопрос: If client-side, how do I configure it?. Этот ответ не о какой-либо функции IDE. Это mvn только конфигурация хранилища. updatePolicyИнтервал ОП просит о.
Монриво
Это может быть принятый ответ @ cprice404.
Монриво
0

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

Мария Помазкина-Карпикова
источник
0

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

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

epcpu
источник
0

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

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

Ни одно из описанных выше решений не помогло мне. Я наконец решил это в IntelliJ IDEA, выбрав File> Invalidate Caches / Restart ...> Invalidate and Restart .

Norat
источник
0

В моем случае у меня было несколько проектов

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

Когда я выполнял «mvn clean install» из каталога «domainProject», я получал указанную ошибку.

Когда я сделал «mvn clean install» из каталога «projectRoot», проблема исчезла.

ChetPrickles
источник