Як я можу змусити Maven припинити спроби перевіряти наявність оновлень на артефакти певної групи від maven-central-repo?


126

Я працюю над досить великим проектом Maven. У нас, мабуть, близько 70-ти окремих артефактів, які приблизно розбиті на дві бібліотеки спільного коду і, можливо, десять додатків, які ними користуються. Усі ці елементи живуть у просторі імен com.mycompany.*.

Більшу частину часу ми зустрічаємо з побудовими знімків. Отже, щоб зробити повне складання програми, я спершу можу створити бібліотечні проекти, щоб вони були встановлені у моєму локальному сховищі (як, скажімо, mycompany-libname-2.4-SNAPSHOT.jar).

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

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

Відповіді:


34

Тег updatePolicy не працював для мене. Однак Річ Продавець зазначив, що знімки слід будь-коли вимкнути, тому я заглянув далі і помітив, що додатковий сховище, яке я додав до моїх налаштувань.xml, насправді викликає проблему. Додавши розділ знімків до цього сховища в моїх налаштуваннях.xml зробив свою справу!

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

Дуже дякую за відповідь. Це врешті-решт мені допомогло. У мене виникли проблеми із завантаженням знімків для одного із сховищ. Завантаження висіло навіть із оновленнями міліції ніколи. Зараз знімки не завантажуються, що саме те, що я хотів.
wolfroma

163

Крім того, ви можете використовувати -oабо --offlineв командному рядку mvn, який переведе Maven в "офлайн-режим", щоб він не перевіряв на оновлення. Ви отримаєте попередження про те, що не зможете отримати залежності не в місцевому репо, але нічого серйозного.


8
Це також зупинить Maven від завантаження звільнених залежностей. Можливо, вам потрібна нова версія випущеної бібліотеки, без знімків, які перевіряються на оновлення
hobgoblin

2
Це ЧИСТО не відповідь на початкове запитання! Як воно може мати стільки оновлень ??? ОП прямо написав, що він намагався запустити Maven в автономному режимі, але це не ідеально для його мети!
Honza Zidek

95

Щось, що зараз доступне і в Maven

mvn goal --no-snapshot-updates

або коротше

mvn goal -nsu

3
Про всяк випадок, якщо хтось із СБТ приземлиться тут: set offline := trueна сесії чи offline := trueв build.sbt.
опіят

5
Також nsuопція порушена в версії 3.0.3 (Див. MNG-5064 ). Щоб надійно використовувати цю опцію, можливо, вам знадобиться оновити до atleast v. 3.0.4 або v. 3.0.5
Ashutosh Jindal

досить найкраще
AntJavaDev

32

Оновлення: я, мабуть, мав би почати з цього, оскільки ваші проекти є SNAPSHOT. Це частина семантики SNAPSHOT, яку Maven перевірятиме на оновлення кожної збірки. Бути SNAPSHOT означає, що він є нестабільним і підлягає зміні, тому слід перевірити оновлення. Однак варто зазначити, що Maven super POM налаштовується центрально, щоб знімати знімки, тому Maven ніколи не повинен перевіряти наявність оновлень на SNAPSHOT на центральному, якщо ви не перекрили це у своїх власних пом / налаштуваннях.


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

У налаштуваннях.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 . Ви можете налаштувати проксі-сховище для центрального проксі-сервера, тому будь-які запити, які, як правило, переходять до центрального, замість цього надсилаються до вашого сховища проксі (або групи сховищ, що містять проксі), а наступні запити кешуються у внутрішньому диспетчері репозиторіїв. Ви навіть можете встановити тайм-аут кешу проксі-сервера на -1, тому він ніколи не запитуватиме вміст із центрального, який уже знаходиться у сховищі проксі.


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

Ви можете налаштувати сховище (у своєму пом’ї чи профілі в settings.xml) наступним чином:

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

Насправді у нас вже є центральне сховище, але, звичайно, ми не публікуємо версії знімків до нього, тому, імовірно, я все-таки отримав би невдалі перевірки оновлення з проксі / дзеркалом на місці - я шукаю спосіб отримати Maven взагалі не перевіряти наявність оновлень на ці артефакти.
Тім Гілберт

1
Варто також встановити логічне сховище у вашому центральному сховищі для ваших SNAPSHOT. Це означає, що вони можуть ділитися між вашими розробниками, і вам не доведеться створювати їх усі локально. Потім ви отримаєте повну користь від SNAPSHOT, підбираючи зміни до будь-яких залежностей від SNAPSHOT, як тільки вони будуть перенесені у віддалений сховище.
Багатий продавець

Дякую - прапор updatePolicy виглядає саме так, що я шукав.
Тім Гілберт

1
Nexus також дозволяє налаштувати правила для запобігання зовнішнім запитам артефактів компанії.
Брайан Фокс

Знімок XML тут уже застарів. updatePolicyЕлемент потрапляє під snapshotsабо releasesелемента. Дивіться: maven.apache.org/settings.html
Джефф Еванс

5

Дуже просто :

У своєму батьківському програмі Super POM або setu.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>

Це мої поради


0

У мене були проблеми, подібні до цього,

<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: Я дотримувався цього підручника про веб-сервіси (btw, мабуть, найкращий підручник для ws для Java)


1
Ви використовуєте Intellij? Тому що Intellij + Maven = ігнорує updatePolicy. Дивіться звіт про помилку youtrack.jetbrains.com/issue/IDEA-76869
Manav
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.