Подтвердить что ты не робот

Как я могу заставить Maven перестать пытаться проверять наличие обновлений для артефактов из определенной группы из maven-central-repo?

Я работаю над довольно большим проектом Maven. У нас, вероятно, около 70 или около того отдельных артефактов, которые примерно разделены на две библиотеки общего кода и, возможно, десять приложений, которые их используют. Все эти элементы находятся в пространстве имен com.mycompany.*.

В большинстве случаев мы выполняем сборку моментальных снимков. Поэтому, чтобы выполнить полную сборку приложения, я мог бы сначала создать проекты библиотек, чтобы они были установлены в мой локальный репозиторий (как, скажем, mycompany-libname-2.4-SNAPSHOT.jar).

Проблема в том, что когда я потом собираюсь создавать приложения. По какой-то причине Maven хочет проверить основные два публичных репозитория (maven-net-repo и java-net-repo) для обновлений для всех артефактов mycompany-*-SNAPSHOT.jar. Конечно, их там нет, и все в конечном итоге решает вернуться к версиям, которые я только что построил для своего локального репозитория, но я хотел бы, чтобы Maven прекратил это делать, потому что (а) это заставляет меня чувствовать себя плохой net.citizen для постоянной проверки этих репозиториев для вещей, которые никогда не будут там, и (б) он добавляет ненужную и раздражающую латентность сети в мой процесс сборки.

Я занимаюсь запуском maven в автономном режиме большую часть времени, чтобы обойти это, но это не идеально, потому что иногда зависимость от публичной библиотеки будет обновляться. Итак, я ищу решение, которое заставит Maven не проверять наличие обновлений из данных репозиториев для артефактов, которые отвечают определенным критериям - в этом случае я был бы счастлив, если бы Maven проигнорировал либо версии SNAPSHOT, либо артефакты, которые были в пространство имен com.mycompany.

4b9b3361

Ответ 1

Тег updatePolicy не работал у меня. Однако Rich Seller отметил, что моментальные снимки должны быть отключены в любом случае, поэтому я посмотрел дальше и заметил, что дополнительный репозиторий, который я добавил в мои settings.xml, фактически вызвал проблему. Добавление раздела моментальных снимков в этот репозиторий в моих настройках. Xml сделал трюк!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>

Ответ 2

Кроме того, вы можете использовать -o или --offline в командной строке mvn, которая поместит maven в "автономный режим", чтобы он не проверял наличие обновлений. Вы получите предупреждение о невозможности получения зависимостей, которые еще не были в вашем локальном репо, но не имеют большого значения.

Ответ 3

Что-то, что теперь доступно в maven, равно

mvn goal --no-snapshot-updates

или короче

mvn goal -nsu

Ответ 4

Обновление. Возможно, я должен был начать с этого, так как ваши проекты - SNAPSHOT. Это часть семантики SNAPSHOT, которую Maven будет проверять на наличие обновлений для каждой сборки. Быть SNAPSHOT означает, что он изменчив и может быть изменен, чтобы обновления проверялись. Однако стоит отметить, что Maven super POM настраивает центральную часть, чтобы отключить моментальные снимки, поэтому Maven никогда не должен проверять обновления для SNAPSHOTs на центральном, если только вы переопределили это в своих собственных настройках/настройках.


Вы можете настроить Maven для использования mirror для центрального репозитория, это перенаправит все запросы, которые обычно идут в центр вашего внутренний репозиторий.

В вашем файле settings.xml вы добавили бы что-то вроде этого, чтобы установить свой внутренний репозиторий как зеркало для центрального:

<mirrors>
  <mirror>
    <id>ibiblio.org</id>
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
    <url>http://path/to/my/repository</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

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


Более базовое решение, если вы работаете только с локальными репозиториями, - это установить updatePolicy для центрального репозитория "никогда", это значит, что Maven будет проверять только артефакты, которые еще не находятся в локальном репозитории. Затем это может быть переопределено в командной строке, когда необходимо, используя ключ -U, чтобы заставить Maven проверять наличие обновлений.

Вы настроили репозиторий (в вашем pom или профиле в файле settings.xml) следующим образом:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>

Ответ 5

Очень просто:

В родительском классе Super POM или файле settings.xml используйте

        <repository>
        <id>central</id>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <updatePolicy>never</updatePolicy>
        </snapshots>
        <url>http://repo1.maven.org/maven2</url>
        <layout>legacy</layout>
    </repository>

Это мои советы

Ответ 6

У меня были некоторые проблемы, похожие на это,

<repository>
    <id>java.net</id>
    <url>https://maven-repository.dev.java.net/nonav/repository</url>
    <layout>legacy</layout>
</repository>
<repository>
    <id>java.net2</id>
    <url>https://maven2-repository.dev.java.net/nonav/repository</url>
</repository>

Настройка updatePolicy на "никогда" не сработала. Удаление этих репо было таким, каким я его решил. ps: Я следил за tutorial о веб-сервисах (кстати, это лучший учебник для ws для java)