Я просто пытаюсь понять логику пользовательских удаленных репозиториев с 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.