Як змусити 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.