Когда 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". Я изменил его на свой собственный путь, и проблема была решена.