2015-11-05 3 views
27

Я использую Maven 3.3.3 с Java 8 на Mac Yosemite. У меня многомодульный проект.Как заставить Maven использовать мой локальный репозиторий, а не выходить на удаленные репозитории для извлечения артефактов?

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

Когда я строю один из моих детей модулей, например, «мой-модуль» сверху, используя «МВН чистой установки», сборка пытается загрузить модуль ребенка артефактов из удаленного хранилища я имею определенный в файле ~/.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> 

Edit: В ответ на ответ sayhing, что происходит между артефакт не был там, ниже терминал вывода, в котором я докажу файл был там в моем репо, но Maven будет tryihng, чтобы загрузить его в любом случае ...

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 
+1

Maven _does_ проверьте свой локальный репозиторий, прежде чем пытаться загрузить артефакт из удаленного репозитория. Вы уверены, что ваш местник имел эти артефакты, прежде чем пытаться выполнить эту сборку? Теперь вы можете проверить свой локальный репозиторий и повторить попытку еще раз. Кроме того, вы можете указать, где находится ваш локальный репозиторий в 'settings.xml' (см. [Здесь] (https://maven.apache.org/settings.html)). – mystarrocks

+0

Хотя я не указал свой репозиторий в моем файле settings.xml, он по умолчанию установлен для меня - ~/.m2/repository. Должен ли я указывать его, даже если это значение по умолчанию? – Dave

+0

Для меня есть другие файлы в моих локальных репозиториях, например * .sha1 или * .lastUpdate. удалите другие файлы, кроме * .jar и * .pom, чтобы предотвратить перенаправление файла maven из удаленного репозитория. – Harun

ответ

18

Зависимость имеет моментальную версию. Для моментальных снимков Maven проверит местный репозиторий, и если артефакт, найденный в локальном репозитории, слишком старый, он попытается найти обновленный в удаленных репозиториях. Вероятно, это то, что вы видите.

Отметим, что это поведение контролируется директивой updatePolicy в конфигурации репозитория (то есть daily по умолчанию для хранилищ моментальных снимков).

+7

возможно, «перезаписать» это аргументом команды консоли? Нравится: mvn clean install -FORCE_COMMAND – Naxos84

+2

«Слишком старый», что означает что? Он выбирает самый новый моментальный снимок, который он может найти, будь то локальный или удаленный? Это было бы ужасно поведением. Я только что создал моментальный снимок, я действительно хочу использовать его, а не тот, который построил CI-сборка только через мгновение. –

-2

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

Сначала запустите mvn install в вашем модуле зависимостей, а затем создайте свой зависимый модуль.

+0

Я отредактировал свой вопрос, чтобы показать, что артефакт находится в репо (обратите внимание на команду «ls -al», которую я запускаю. Maven пытается загрузить его в любом случае. Любые другие идеи? – Dave

+3

@Oliver: вам не хватает того факта, что для артефактов в локальном репозитории Maven может по-прежнему обращаться к удаленным репозиториям, если артефакт - слишком старый снимок. –

1

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

От:

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

To:

<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.

Это очень сильно сбило меня с толку, потому что модуль был доступен локально.

8

Используйте mvn --help, и вы можете увидеть список опций.

Существует вариант, как -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

Так используйте команду mvn install -nsu могут заставить компилировать с локальным хранилищем.

+0

Y ou также может использовать '-o' для« автономного »поведения maven – Sean

+0

Параметр -nsu не мешает mvn пытаться и не загружать артефакт удаленно, если он еще не загружен, вместо использования локальной сборки, например, когда артефакт был построен и установлен локально. - – user1767316

0

Чтобы по-настоящему сила Maven для только использовать ваш локальный репозиторий, вы можете работать с mvn <goals> -o. -o сообщает maven, что позволяет вам работать в автономном режиме, и он будет оставаться в сети.

+0

Параметр -o не мешает mvn пытаться и не загружать артефакт удаленно, если он еще не загружен, вместо локальной сборки, например, когда артефакт был создан и установлен локально. – user1767316

+2

Это правда - если у вас нет локальной копии, вам не повезло. Это полезно для проектов, которые вы создали ранее, но, возможно, имеют недавние изменения SNAPSHOT, которые вам не нужны. – Sean

+0

Или даже если вы никогда не строили проект, вы могли бы подготовиться к его созданию в автономном режиме с помощью 'mvn dependency: go-offline' – Aldian