Могу ли я добавить файлы jar в maven 2 buildpath без их установки? - PullRequest
674 голосов
/ 12 декабря 2008

Maven2 сводит меня с ума во время фазы эксперимента / быстрого и грязного макета разработки.

У меня есть файл pom.xml, который определяет зависимости для инфраструктуры веб-приложений, которую я хочу использовать, и я могу быстро сгенерировать начальные проекты из этого файла. Однако иногда я хочу сделать ссылку на стороннюю библиотеку, в которой еще не определен файл pom.xml, вместо того, чтобы вручную создать файл pom.xml для сторонней библиотеки lib, установить его и добавить зависимость к my pom.xml, я просто хотел бы сказать Maven: «В дополнение к моим определенным зависимостям, включите любые jar-файлы, которые также находятся в /lib».

Кажется, это должно быть просто, но если это так, я что-то упускаю.

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

Ответы [ 23 ]

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

проблемы популярных подходов

Большинство ответов, которые вы найдете в Интернете, предложат вам либо установить зависимость в локальном репозитории, либо указать область действия «system» в pom и распространить зависимость с источником вашего проекта. Но оба эти решения на самом деле несовершенны.

Почему не следует применять подход «Установка в локальный репо»

Когда вы устанавливаете зависимость в свой локальный репозиторий, он остается там. С вашим артефактом распространения все будет хорошо, если у него есть доступ к этому хранилищу. Проблема в том, что в большинстве случаев этот репозиторий будет находиться на вашем локальном компьютере, поэтому не будет никакого способа разрешить эту зависимость на любом другом компьютере. Очевидно, что зависимость вашего артефакта от конкретной машины - это не способ справиться с ситуацией. В противном случае эта зависимость должна быть установлена ​​локально на каждой машине, работающей с этим проектом, что не лучше.

Почему вы не должны применять подход "Scope System"

Банки, от которых зависит подход System Scope, не устанавливаются ни в какой репозиторий и не подключаются к целевым пакетам. Вот почему ваш дистрибутив не сможет решить эту зависимость при использовании. Именно это, я считаю, и стало причиной того, что использование системной области даже устарело. В любом случае, вы не хотите полагаться на устаревшую функцию.

Решение статического репозитория в проекте

После помещения этого в ваш pom:

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

для каждого артефакта с идентификатором группы в форме x.y.z Maven будет включать следующее местоположение в директории вашего проекта при поиске артефактов:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

Подробнее об этом вы можете прочитать в этом блоге .

Используйте Maven для установки в репозиторий проекта

Вместо создания этой структуры вручную, я рекомендую использовать плагин Maven для установки ваших jar-файлов в качестве артефактов. Итак, чтобы установить артефакт в репозиторий в проекте в папке repo, выполните:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

Если вы выберете этот подход, вы сможете упростить объявление репозитория в pom до:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

вспомогательный скрипт

Поскольку выполнение команды установки для каждой библиотеки является довольно раздражающим и определенно подверженным ошибкам, я создал служебный скрипт , который автоматически устанавливает все файлы jar из папки lib в репозиторий проекта, при этом автоматически разрешение всех метаданных (groupId, artifactId и т. д.) из имен файлов. Сценарий также выводит на экран xml-зависимости для копирования-вставки в pom.

Включите зависимости в целевой пакет

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

Чтобы решить эту проблему, я предлагаю включить эти зависимости в ваш целевой пакет. Это можно сделать либо с помощью Assembly Plugin , либо лучше с OneJar Plugin . Официальную документацию по OneJar легко понять.

470 голосов
/ 13 декабря 2008

Только для одноразового кода

установить область видимости == system и просто создать идентификатор группы, artifactId и версию

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

Примечание: системные зависимости не копируются в полученный jar / war
(см. Как включить системные зависимости в войну, построенную с использованием maven )

54 голосов
/ 05 октября 2012

Вы можете создать локальный репозиторий для вашего проекта

Например, если в структуре проекта есть папка libs

  • В папке libs вы должны создать структуру каталогов: /groupId/artifactId/version/artifactId-version.jar

  • В вашем pom.xml вы должны зарегистрировать репозиторий

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
    
  • и добавить зависимость как обычно

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>
    

Вот и все.

Для получения подробной информации: Как добавить внешние библиотеки в Maven

31 голосов
/ 09 января 2009

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

Если ваши jar-файлы находятся в корне вашего проекта, вам нужно добавить префикс значений systemPath к $ {basedir}.

14 голосов
/ 19 апреля 2009

Вы действительно должны установить фреймворк через репозиторий и заранее определить ваши зависимости. Использование системной области является распространенной ошибкой, которую используют люди, потому что они «не заботятся об управлении зависимостями». Проблема в том, что, делая это, вы получаете извращенную сборку maven, которая не будет отображать maven в нормальном состоянии. Вы бы лучше придерживались подхода, подобного this .

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

Это то, что я сделал, он также работает с проблемой пакета и работает с проверенным кодом.

Я создал новую папку в проекте, в моем случае я использовал repo, но не стесняйтесь использовать src/repo

В моем ПОМ у меня была зависимость, которой нет ни в одном публичном репозитории maven

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

Затем я создал следующие каталоги repo/com/dovetail/zoslog4j/1.0.1 и скопировал файл JAR в эту папку.

Я создал следующий файл POM для представления загруженного файла (этот шаг не является обязательным, но он удаляет ПРЕДУПРЕЖДЕНИЕ) и помогает следующему парню выяснить, где я получил файл для начала.

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

Два необязательных файла, которые я создаю, это контрольные суммы SHA1 для POM и JAR для удаления предупреждений о пропущенной контрольной сумме.

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

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

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>
12 голосов
/ 09 января 2009

Плагин установки Maven имеет использование командной строки для установки jar в локальный репозиторий, POM является необязательным, но вам нужно будет указать GroupId, ArtifactId, Version и Packaging (все POM).

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

Вот так мы добавляем или устанавливаем локальный jar

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>iamajar</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
    </dependency>

я дал некоторые значения по умолчанию groupId и artifactId, потому что они являются обязательными:)

8 голосов
/ 03 июня 2013

Я нашел другой способ сделать это, см. Здесь из сообщения Heroku

Подводя итог (извините за некоторые скопировать и вставить)

  • Создайте каталог repo в корневой папке:
yourproject
+- pom.xml
+- src
+- repo
  • Запустите это, чтобы установить jar в локальный каталог репо
mvn deploy:deploy-file -Durl=file:///path/to/yourproject/repo/ -Dfile=mylib-1.0.jar -DgroupId=com.example -DartifactId=mylib -Dpackaging=jar -Dversion=1.0
  • Добавьте это ваше pom.xml:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>
8 голосов
/ 10 мая 2013

Использование <scope>system</scope> - ужасная идея по причинам, объясненным другими, установка файла вручную в локальный репозиторий делает сборку невоспроизводимой, а использование <url>file://${project.basedir}/repo</url> также не является хорошей идеей, поскольку (1) это может быть правильно сформированный file URL-адрес (например, если проект извлечен из каталога с необычными символами), (2) результат непригоден для использования, если POM этого проекта используется в качестве зависимости от проекта другого пользователя.

Если вы не хотите загружать артефакт в общедоступный репозиторий, предложение Симеона о вспомогательном модуле делает эту работу. Но теперь есть более легкий путь ...

Рекомендация

Используйте non-maven-jar-maven-plugin . Делает именно то, что вы просили, без каких-либо недостатков других подходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...