Maven: добавить зависимость к банке по относительному пути - PullRequest
213 голосов
/ 09 февраля 2010

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

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

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

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

Ответы [ 9 ]

326 голосов
/ 09 февраля 2010

Я хочу, чтобы файл jar находился в 3-й части библиотеки управления исходными кодами, и ссылка на него по относительному пути из файла 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, поскольку ваша зависимость будет рассматриваться как добропорядочный гражданин (например, она будет включена в сборкуи так далее).

Теперь я должен упомянуть, что «правильный путь» для решения этой ситуации в корпоративной среде (возможно, не в данном случае) заключается в использовании корпоративного хранилища.

117 голосов
/ 09 февраля 2010

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

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

Тем не менее, рекомендуется установить JAR в репозиторий, а не фиксировать его в SCM - в конце концов это то, что maven пытается устранить.

27 голосов
/ 27 октября 2011

Это еще один метод в дополнение к моему предыдущему ответу на Могу ли я добавить 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>

Чтобы установить более одного файла, просто добавьте больше исполнений.

9 голосов
/ 10 февраля 2010

Я ранее писал о шаблоне для этого.

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

8 голосов
/ 22 октября 2016

Это работает для меня: Допустим, у меня есть эта зависимость

<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>
4 голосов
/ 18 ноября 2014

В общем, добавьте это в 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>
4 голосов
/ 04 января 2013

мы перешли на gradle, и в gradle это работает намного лучше;).мы просто указываем папку, в которую мы можем бросить банки для таких временных ситуаций.У нас до сих пор большинство наших jar-файлов определены в типичном разделе управления зависимостями (т.е. так же, как в maven).Это еще одна зависимость, которую мы определяем.

, поэтому теперь мы можем просто поместить любой jar-файл в нашу директорию lib для временного тестирования, если он где-то не находится в репозитории maven.

2 голосов
/ 31 июля 2014

Одно небольшое дополнение к решению, опубликованному Паскалем

Когда я пошел по этому маршруту, я получил ошибку в 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
0 голосов
/ 05 января 2016

Вы можете использовать eclipse для генерации работающего Jar Экспорт / запускаемый файл Jar

...