Странное поведение при использовании пользовательских удаленных репозиториев в Maven - PullRequest
1 голос
/ 15 декабря 2011

Я просто пытаюсь понять логику пользовательских удаленных репозиториев с Maven.В одном эксперименте (в OS X с использованием командной строки) я объявляю удаленный репозиторий в POM следующим образом: (на самом деле это не совсем удаленно, поскольку я использую file: /// ...):

<repositories>
    <repository>
      <id>myRepository</id>
      <url>file:///test_mvrepository/repository</url>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
</repositories>

В этом POM также объявляется зависимость от определенного артефакта X (библиотека JPL в моем примере), который присутствует только в «удаленном» хранилище, а не в локальном:

<dependencies>
    <dependency>
        <groupId>jpl</groupId>
        <artifactId>jpl</artifactId>
        <version>[3.1.4-alpha,]</version>
    </dependency>
    ...
</dependencies>

Когда я выполняю это:

mvn package

Проект строится как положено только один раз .Если я повторю операцию, у меня будет сообщение о том, что мой артефакт X недоступен:

[ERROR] Failed to execute goal on project projectname: Could not resolve dependencies for project groupid:artifactid:jar:0.0.1-SNAPSHOT: Could not find artifact jpl:jpl:jar:3.1.4-alpha -> [Help 1]

Вот полное POM:

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>groupId</groupId>
  <artifactId>artifactId</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <repositories>
    <repository>
      <id>repId</id>
      <url>file:///test_mvrepository/repository</url>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>
  <dependencies>
    <dependency>
        <groupId>jpl</groupId>
        <artifactId>jpl</artifactId>
        <version>[3.1.4-alpha,]</version>
    </dependency>
    ...
  </dependencies>

</project>

После некоторой отладки я обнаружил, что, хотя я не установил POM с mvn install, артефакт X находится в локальном хранилище (его POM, jar и дополнительные файлы).Только если я удалю запись из своего локального репозитория, я смогу повторить операцию снова, не получив сообщение об ошибке.На самом деле мне не нужно удалять все записи в локальном репозитории, только файл maven-metadata-local.xml.Вот как выглядит этот файл:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>jpl</groupId>
  <artifactId>jpl</artifactId>
  <versioning>
    <release>3.1.4-alpha</release>
    <versions>
      <version>3.1.4-alpha</version>
    </versions>
    <lastUpdated>20111214230431</lastUpdated>
  </versioning>

В моем удаленном хранилище этот файл называется maven-metadata.xml.

Наконец, если вместо этого я наберу

mvn install

Тогда X всегда доступен, как и ожидалось, не только один раз, как в предыдущем случае.

Я не могу понять логику этого.Почему я не могу попросить Maven упаковать мой артефакт много раз в этой обстановке?Для меня очевидно, что если я не устанавливаю его в локальный репозиторий, то он должен идти снова и снова в удаленный репозиторий.Или, по крайней мере, он должен установить необходимые объекты в локальном хранилище таким образом, чтобы я мог обратиться к ним позже, вместо того, чтобы блокировать все будущие запросы package, пока я не удалю запись вручную?Это ошибка в Maven?спасибо за любые разъяснения!

Обновление: В случае, если это важно, вот как я построил свой тестовый сценарий:

  • Я установил в своем локальном хранилище библиотеку JPL(его зависимость вызывает у меня проблемы).Я сделал это с помощью этой команды:

    mvn install: install-file -Dfile = jpl.jar -DgroupId = jpl -DartifactId = jpl -Dversion = 3.1.4-alpha -Dpackaging = jar

  • Я скопировал локальный репозиторий в новое место в файловой системе (мой «удаленный» репозиторий), и в этом новом месте я изменил имя maven-metadata-local.xml записи JPL на maven-metadata.xml, как объяснено здесь: http://www.javaworld.com/community/node/3968.

  • Я удалил из своего локального хранилища запись JPL.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Если вы хотите создать удаленный репозиторий для хранения своих артефактов, вы должны загрузить в него свои артефакты, используя фазу deploy вместо фазы install.

install фаза загружает ваши артефакты в ваш local репозиторий, который по умолчанию находится в ~/.m2/ или {USER.HOME}/.m2/. Ваш локальный репозиторий является только кешем для удаленных репозиториев.

На этапе

deploy используется информация distributionManagement, предоставленная в файле pom, для развертывания артефакта в удаленном хранилище. Вы можете создать свое определение distributionManagement следующим образом:

<distributionManagement>
  <repository>
    <id>SomeId</id>
    <name>SomeName</name>
    <url>file:///test_mvrepository/repository</url>
  </repository>
</distributionManagement>

Для получения дополнительной информации об управлении дистрибуцией вы можете обратиться на этот сайт .

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

Вы можете прочитать больше об информации о репозиториях и maven жизненных циклах . Есть также несколько похожих вопросов по SO, на которые очень хорошо ответил здесь и здесь .

1 голос
/ 15 декабря 2011

mvn install добавляет текущий проект в локальный репозиторий.Зависимости кэшируются в локальном хранилище, когда вы вызываете любую цель или фазу Maven.Таким образом, вы всегда ожидаете, что X окажется в локальном хранилище, независимо от фазы, которую вы используете.

Однако поведение, которое вы видите, странное.Есть ли проблема с правами доступа к файлам?Не могли бы вы обновить сообщение с точной ошибкой, которую вы получаете, когда запускаете mvn package во второй раз?

РЕДАКТИРОВАТЬ

ОК Я подозреваю, что с m2e происходит что-то странное.Происходит ли это при использовании командной строки?

Можете ли вы попробовать вместо этого связать плагин copy-зависимостей с пакетом?Это должно помешать m2e делать странные вещи в Eclipse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...