Вопрос-ответ

Maven: add a dependency to a jar by relative path

Maven: добавление зависимости в jar по относительному пути

У меня есть проприетарный jar, который я хочу добавить в свой pom в качестве зависимости.

Но я не хочу добавлять ее в репозиторий. Причина в том, что я хочу, чтобы мои обычные команды maven, такие как mvn compile и т.д., работали "из коробки". (Не требуя от разработчиков самостоятельно добавлять ее в какой-либо репозиторий).

Я хочу, чтобы jar находился в 3-сторонней библиотеке в системе управления версиями и ссылался на нее по относительному пути из файла pom.xml.

Можно ли это сделать? Как?

Переведено автоматически
Ответ 1

Я хочу, чтобы jar находился в 3-сторонней библиотеке в системе управления версиями и ссылался на нее по относительному пути из файла pom.xml.


Если вы действительно этого хотите (поймите, если вы не можете использовать корпоративный репозиторий), то моим советом было бы использовать "файловый репозиторий", локальный для проекта, и не использовать system зависимость с ограниченной областью действия. Следует избегать system области видимости, такие зависимости плохо работают во многих ситуациях (например, в сборке), они вызывают больше проблем, чем пользы.

Итак, вместо этого объявите репозиторий локальным для проекта:

<repositories>
<repository>
<id>my-local-repo</id>
<url>file://${project.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-установке-плагину

Наконец, объявите ее как любую другую зависимость (но без system области видимости):

<dependency>
<groupId>your.group.id</groupId>
<artifactId>3rdparty</artifactId>
<version>X.Y.Z</version>
</dependency>

ИМХО, это лучшее решение, чем использование system области видимости, поскольку к вашей зависимости будут относиться как к добропорядочному гражданину (например, она будет включена в сборку и так далее).

Теперь я должен упомянуть, что "правильным способом" справиться с этой ситуацией в корпоративной среде (возможно, здесь это не так) было бы использовать корпоративный репозиторий.

Ответ 2

Используя system область видимости. ${basedir} это каталог вашего pom.

<dependency>
<artifactId>..</artifactId>
<groupId>..</groupId>
<scope>system</scope>
<systemPath>${basedir}/lib/dependency.jar</systemPath>
</dependency>

However it is advisable that you install your jar in the repository, and not commit it to the SCM - after all that's what maven tries to eliminate.

Ответ 3

This is another method in addition to my previous answer at Can I add jars to maven 2 build classpath without installing them?

This will get around the limit when using multi-module builds especially if the downloaded JAR is referenced in child projects outside of the parent. This also reduces the setup work by creating the POM and the SHA1 files as part of the build. It also allows the file to reside anywhere in the project without fixing the names or following the maven repository structure.

This uses the maven-install-plugin. For this to work, you need to set up a multi-module project and have a new project representing the build to install files into the local repository and ensure that one is first.

You multi-module project pom.xml would look like this:

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

The repository/pom.xml file will then contain the definitions to load up the JARs that are part of your project. The following are some snippets of the pom.xml file.

<artifactId>repository</artifactId>
<packaging>pom</packaging>

The pom packaging prevents this from doing any tests or compile or generating any jar file. The meat of the pom.xml is in the build section where the maven-install-plugin is used.

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

To install more than one file, just add more executions.

Ответ 4

This is working for me:
Let's say I have this dependency

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

Then, add the class-path for your system dependency manually like this

<Class-Path>libs/my-library-1.0.jar</Class-Path>

Full config:

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