Як змусити Maven використовувати моє локальне сховище, а не виходити на віддалені репозиторії для отримання артефактів?


97

Я використовую Maven 3.3.3 з Java 8 на Mac Yosemite. У мене є багатомодульний проект.

    <modules>
            <module>first-module</module>
            <module>my-module</module></modules>

Коли я будую свій один із своїх дочірніх модулів, наприклад, “my-module” зверху, використовуючи “mvn clean install”, збірка намагається завантажити артефакти дочірнього модуля з віддаленого сховища, яке я визначив у своєму ~ / .m2 Файл /settings.xml. Вихідні дані нижче

[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.9 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151104.200545-4.pom

Як змусити Maven спочатку перевірити свій локальний ~ / .m2 / репозиторій перед спробою завантажити з віддалених сховищ? Нижче я знаходжу свої віддалені сховища, визначені у моєму файлі ~ / .m2 / settings.xml ...

<profile>
    <id>releases</id>
    <activation>
        <property>
            <name>!releases.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>releases</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
<profile>
    <id>snapshots</id>
    <activation>
        <property>
            <name>!snapshots.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>snapshots</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

Редагувати: У відповідь на відповідь про те, що завантаження відбувається, коли артефакту немає, нижче наведено вихід терміналу, в якому я доказую, що файл був у моєму репо, але Maven все одно намагається його завантажити ...

Daves-MacBook-Pro-2:my-module davea$ ls -al ~/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar 
-rw-r--r--  1 davea  staff  10171 Nov  5 10:22 /Users/davea/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
Daves-MacBook-Pro-2:my-module davea$ mvn clean install
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.mainco.subco:my-module:jar:87.0.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-antrun-plugin @ org.mainco.subco:my-module:[unknown-version], /Users/davea/Documents/sb_workspace/my-module/pom.xml, line 678, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.8 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151106.043202-8.pom
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-   module-87.0.0-20151106.043202-8.pom (3 KB at 21.9 KB/sec)
Downloading: http://download.java.net/maven/2/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml

2
Maven робить перевірити локальне сховище , перш ніж намагатися завантажити артефакт з віддаленого сховища. Ви впевнені, що у вашого місцевого жителя були ці артефакти до того, як ви зробили спробу побудови? Ви можете перевірити свій локальний репозиторій зараз і все одно спробувати ще одну збірку. Крім того, ви можете вказати, де знаходиться ваш локальний репозиторій settings.xml(див. Тут ).
mystarrocks

Хоча я не вказав своє сховище у своєму файлі settings.xml, це за замовчуванням, яке Maven встановив для мене - ~ / .m2 / repository. Чи потрібно це вказувати, навіть якщо це за замовчуванням?
Дейв

Для мене є інші файли в моїх локальних сховищах, такі як * .sha1 або * .lastUpdate. видалити інші файли, крім * .jar та * .pom, перешкоджатиме maven повторно завантажувати файл із віддаленого сховища
Харун,

Відповіді:


45

Залежність має знімок версії. Для моментальних знімків Maven перевірить локальне сховище, і якщо артефакт, знайдений у локальному сховищі, занадто старий, він спробує знайти оновлений у віддалених сховищах. Це, мабуть, те, що ви бачите.

Зверніть увагу, що ця поведінка контролюється updatePolicyдирективою в конфігурації сховища (яка dailyза замовчуванням є для сховищ моментальних знімків).


16
Чи можна "перезаписати" це за допомогою аргументу команди консолі? Подібно: mvn clean install -FORCE_COMMAND
Naxos84

21
"Занадто старий", що означає? Він вибирає найновіший знімок, який може знайти, будь то локальний чи віддалений? Напевно, це буде жахливою поведінкою. Якщо я щойно створив знімок, я дійсно хочу скористатися ним, а не тим, який побудований CI-побудовою створив лише мить пізніше.
Tom Quarendon

Поясніть, будь ласка, більше про те, що означає "Занадто старий"?
Đỗ Công

32

Використовуйте, mvn --helpі ви побачите список варіантів.

Є такий варіант, як -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

Тож команда use mvn install -nsuможе змусити компілювати з локального сховища.


10
Ви також можете використовувати -o"офлайн" поведінку maven
Шон

8
Параметр -nsu не заважає mvn спробувати не вдатися завантажити артефакт віддалено, якщо він ще не завантажений, замість використання локальної збірки, наприклад, коли артефакт створювався та встановлювався локально. -
user1767316

У мене була та сама проблема з тим, що артефакт ще не завантажений, і це мені це виправило: maven.apache.org/general.html#importing-jars
Луїджі Крісталлі,

15

Щоб по-справжньому змусити maven використовувати лише ваш локальний репо, ви можете запустити mvn <goals> -o. -oКаже Maven , щоб дозволити вам працювати « в автономному режимі», і він буде залишатися поза мережею.


5
Параметр -o не заважає mvn спробувати не вдатися завантажити артефакт віддалено, якщо він ще не завантажений, замість використання локальної збірки, наприклад, коли артефакт створювався та встановлювався локально.
user1767316

2
це правда - якщо у вас немає локальної копії, вам не пощастило. Це корисно для проектів, які ви будували раніше, але потенційно можуть мати нещодавні зміни SNAPSHOT, які вам не байдужі.
Шон,

Або навіть якщо ви ніколи не будували проект, ви могли б підготуватися до його побудови в автономному режиміmvn dependency:go-offline
Алдіан

Що робити, якщо у вас є локальна копія, яку ви щойно встановили (тому вона ніколи не буде розгорнута / доступна у віддаленому репо-знімку)?
Вівек Чавда,

1
Ах, я щойно створив проект pom з колекцією залежностей, але не вказав <type> pom </type> у споживаючому проекті, тому він шукав банку (і, звичайно, не міг її знайти, навіть у режимі офлайн)
Вівек Чавда,

4

У моєму випадку у мене був багатомодульний проект, як у вас. Мені довелося змінити ідентифікатор групи однієї із зовнішніх бібліотек, в залежності від мого проекту, як показано нижче.

Від:

<dependencyManagement>
    <dependency>
        <groupId>org.thirdparty</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

Кому:

<dependencyManagement>
   <dependency>
      <groupId>org.thirdparty.module</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

Зверніть увагу на розділ <groupId>. Виявилося, що я забув модифікувати відповідний розділ підмодулів, які визначають цю залежність у своїх файлах pom.

Це звели мене з розуму, тому що модуль був доступний локально.


4

Виконайте наступні кроки:

    1. Обов’язково видаліть весь вміст папки jar, розташованої у вашому локальному відділенні, окрім банки, яку ви хочете зберегти.
      Наприклад, такі файли, як .repositories, .pom, .sha1, .lastUpdated тощо.
    1. Виконати mvn clean install -oкоманду

Це допоможе використовувати локальні файли jar-сховища, а не підключатись до будь-якого сховища.


1
Видалення лише *.repositoriesта *.sha1файлів працювало для мене
DLight

2

Опція -o у мене не спрацювала, оскільки артефакт все ще перебуває в розробці і ще не завантажений, а maven (3.5.x) все ще намагається завантажити його з віддаленого сховища, оскільки це перший раз, відповідно до помилки, яку я отримую.

Однак це виправило це для мене: https://maven.apache.org/general.html#importing-jars

Після цієї інструкції, встановленої вручну, також не потрібно використовувати опцію офлайн.

ОНОВЛЕННЯ

Я щойно відновив залежність, і мені довелося її повторно імпортувати: звичайної mvn clean installдля мене було недостатньо


-1

Maven завжди спочатку перевіряє ваш локальний репозиторій, однак, ваша залежність повинна бути встановлена ​​у вашому репозиторії, щоб maven знайшов її.

mvn installСпочатку запустіть свій модуль залежностей, а потім побудуйте свій залежний модуль.


1
Я відредагував своє запитання, щоб показати, що артефакт знаходиться в репо (зверніть увагу на команду "ls -al", яку я запускаю. Проте Maven все одно намагається його завантажити. Будь-які інші ідеї?
Дейв,

5
@Oliver: вам не вистачає того факту, що щодо артефактів у локальному сховищі Maven все ще може звернутися до віддалених сховищ, якщо артефакт є занадто старим знімком.
Andreas Veithen,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.