У меня есть собственная банка, которую я хочу добавить к своему англичанину как зависимость.
Но я не хочу добавлять его к репозиторию. Причина состоит в том, что я хочу свои обычные команды знатока такой как mvn compile
, и т.д., для работы из поля. (Не требуя от разработчиков для добавления его к некоторому репозиторию собой).
Я хочу, чтобы банка была в стороннем lib в управлении исходным кодом и связалась с ним относительным путем из файла pom.xml.
Это может быть сделано? Как?
Я хочу, чтобы jar находился в сторонней библиотеке в системе управления версиями и ссылался на него по относительному пути из файла pom.xml.
Если вы действительно этого хотите (поймите, если вы не можете использовать корпоративный репозиторий), я бы посоветовал использовать локальный «файловый репозиторий» для проекта и не использовать a зависимость с областью видимости системы
. Следует избегать применения системы в области видимости
, такие зависимости не работают во многих ситуациях (например, при сборке), они вызывают больше проблем, чем преимуществ.
Вместо этого объявите репозиторий локальным для проекта:
<repositories>
<repository>
<id>my-local-repo</id>
<url>file://${basedir}/my-repo</url>
</repository>
</repositories>
Установите там вашу стороннюю библиотеку, используя install: install-file
с параметром localRepositoryPath
:
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<myGroup> \
-DartifactId=<myArtifactId> -Dversion=<myVersion> \
-Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>
] Обновление: Похоже, что install: install-file
игнорирует localRepositoryPath
при использовании версии 2.2 плагина. Однако он работает с версией плагина 2.3 и новее.Поэтому используйте полное имя подключаемого модуля, чтобы указать версию:
mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \
-Dfile=<path-to-file> -DgroupId=<myGroup> \
-DartifactId=<myArtifactId> -Dversion=<myVersion> \
-Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>
maven-install-plugin documentation
Наконец, объявите его как любую другую зависимость (но без области system
):
<dependency>
<groupId>your.group.id</groupId>
<artifactId>3rdparty</artifactId>
<version>X.Y.Z</version>
</dependency>
Это IMHO лучшее решение, чем использование области system
, поскольку ваша зависимость будет рассматриваться как хороший гражданин (например, она будет включена в сборку и так далее).
Теперь я должен упомянуть, что «правильный способ» справиться с этой ситуацией в корпоративной среде (возможно, здесь не так) - это использовать корпоративный репозиторий.
Используя область действия системы
. ${basedir}
- это каталог вашего pom.
<dependency>
<artifactId>..</artifactId>
<groupId>..</groupId>
<scope>system</scope>
<systemPath>${basedir}/lib/dependency.jar</systemPath>
</dependency>
Однако желательно установить банку в репозиторий, а не коммитировать ее в SCM - в конце концов, это то, что maven пытается устранить.
Ранее я уже писал о шаблоне для этого.
Он очень похож на решение, предложенное Pascal, хотя он перемещает все такие зависимости в специальный модуль репозитория, так что вам не придется повторять это везде, где используется зависимость, если это многомодульная сборка.