Maven: добавить зависимость к банке по относительному пути
У меня есть запатентованная фляга, которую я хочу добавить к своему пому как зависимость.
Но я не хочу добавлять его в хранилище. Причина в том, что мне нужны мои обычные команды maven, такие как mvn compile
и т. д., чтобы работать из коробки. (Не требуя от разработчиков добавить его в какой-либо репозиторий самостоятельно).
Я хочу, чтобы файл jar находился в третьей части библиотеки управления исходными кодами, и связывался с ней по относительному пути из файла pom.xml.
Можно ли это сделать? Как?
10 ответов
Я хочу, чтобы файл jar находился в третьей части библиотеки управления исходными кодами, и связывался с ней по относительному пути из файла pom.xml.
Если вы действительно этого хотите (понимаете, если вы не можете использовать корпоративный репозиторий), то мой совет - использовать "файловый репозиторий", локальный для проекта, и не использовать system
ограниченная зависимость. system
Следует избегать границ, такие зависимости не работают во многих ситуациях (например, при сборке), они вызывают больше проблем, чем выгод.
Поэтому вместо этого объявите локальный репозиторий проекта:
<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 документация
Наконец, объявите это как любую другую зависимость (но без system
объем):
<dependency>
<groupId>your.group.id</groupId>
<artifactId>3rdparty</artifactId>
<version>X.Y.Z</version>
</dependency>
Это ИМХО лучшее решение, чем использование system
область как ваша зависимость будет рассматриваться как хороший гражданин (например, он будет включен в сборку и т. д.).
Теперь я должен упомянуть, что "правильным способом" справиться с этой ситуацией в корпоративной среде (может быть, и не здесь) является использование корпоративного хранилища.
С использованием system
объем. ${basedir}
это каталог вашего пом.
<dependency>
<artifactId>..</artifactId>
<groupId>..</groupId>
<scope>system</scope>
<systemPath>${basedir}/lib/dependency.jar</systemPath>
</dependency>
Тем не менее, желательно, чтобы вы установили свой jar в репозиторий, а не передавали его в SCM - в конце концов это то, что maven пытается устранить.
Это еще один метод в дополнение к моему предыдущему ответу в разделе Могу ли я добавить jar-файлы в maven 2 buildpath, не устанавливая их?
Это позволит преодолеть ограничение при использовании многомодульных сборок, особенно если на загруженный JAR ссылаются в дочерних проектах вне родительского. Это также уменьшает объем работ по настройке, создавая файлы POM и SHA1 как часть сборки. Это также позволяет файлу находиться в любом месте проекта, не исправляя имена и не следуя структуре репозитория maven.
Это использует maven-install-plugin. Чтобы это работало, вам нужно настроить многомодульный проект и иметь новый проект, представляющий сборку, чтобы установить файлы в локальный репозиторий и убедиться, что он первый.
Ваш многомодульный проект pom.xml будет выглядеть так:
<packaging>pom</packaging>
<modules>
<!-- The repository module must be first in order to ensure
that the local repository is populated -->
<module>repository</module>
<module>... other modules ...</module>
</modules>
Файл repository/pom.xml будет содержать определения для загрузки JAR-файлов, которые являются частью вашего проекта. Ниже приведены некоторые фрагменты файла pom.xml.
<artifactId>repository</artifactId>
<packaging>pom</packaging>
Упаковка pom не позволяет выполнять какие-либо тесты, компилировать или генерировать jar-файл. Мясо pom.xml находится в разделе сборки, где используется maven-install-plugin.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>com.ibm.db2:db2jcc</id>
<phase>verify</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>com.ibm.db2</groupId>
<artifactId>db2jcc</artifactId>
<version>9.0.0</version>
<packaging>jar</packaging>
<file>${basedir}/src/jars/db2jcc.jar</file>
<createChecksum>true</createChecksum>
<generatePom>true</generatePom>
</configuration>
</execution>
<execution>...</execution>
</executions>
</plugin>
</plugins>
</build>
Чтобы установить более одного файла, просто добавьте больше исполнений.
Это работает для меня: допустим, у меня есть эта зависимость
<dependency>
<groupId>com.company.app</groupId>
<artifactId>my-library</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/my-library.jar</systemPath>
</dependency>
Затем добавьте путь к классу для вашей системной зависимости вручную, как это
<Class-Path>libs/my-library-1.0.jar</Class-Path>
Полная конфигурация:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifestEntries>
<Build-Jdk>${jdk.version}</Build-Jdk>
<Implementation-Title>${project.name}</Implementation-Title>
<Implementation-Version>${project.version}</Implementation-Version>
<Specification-Title>${project.name} Library</Specification-Title>
<Specification-Version>${project.version}</Specification-Version>
<Class-Path>libs/my-library-1.0.jar</Class-Path>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.company.app.MainClass</mainClass>
<classpathPrefix>libs/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Я ранее писал о шаблоне для этого.
Это очень похоже на решение, предложенное Паскалем, хотя оно перемещает все такие зависимости в выделенный модуль репозитория, чтобы вам не приходилось повторять его везде, где используется зависимость, если это многомодульная сборка.
В основном, добавьте это в pom.xml:
...
<repositories>
<repository>
<id>lib_id</id>
<url>file://${project.basedir}/lib</url>
</repository>
</repositories>
...
<dependencies>
...
<dependency>
<groupId>com.mylibrary</groupId>
<artifactId>mylibraryname</artifactId>
<version>1.0.0</version>
</dependency>
...
</dependencies>
Мы перешли на gradle, и в gradle это работает намного лучше;). мы просто указываем папку, в которую мы можем бросить банки для таких временных ситуаций. У нас все еще есть большинство наших jar-файлов, определенных в типичном разделе управления зависимостями (т.е. так же, как в maven). Это еще одна зависимость, которую мы определяем.
так что теперь мы можем просто поместить любой jar-файл в нашу директорию lib для временного тестирования, если он не находится где-нибудь в репозитории maven.
Небольшое дополнение к решению, опубликованному Паскалем
Когда я следовал по этому маршруту, я получил ошибку в maven при установке ojdbc jar.
[INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator ---
[INFO] pom.xml not found in ojdbc14.jar
После добавления -DpomFile проблема была решена.
$ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \
-DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \
-DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom
Я столкнулся с той же проблемой, и она работает, просто удаляя параметр DlocalRepositoryPath и определяя правильный путь из текущего местоположения в параметре Dfile:
mvn install:install-file -Dfile=./repo/com/tridion/cd_core/1.0/cd_core-1.0.jar -DgroupId=com.tridion -DartifactId=cd_core -Dversion=1.0 -Dpackaging=jar
Примечание. Apache Maven 3.8.6
Вы можете использовать eclipse для создания исполняемого файла Jar: Export/Runable Jar