Можно ли добавить JAR-файлы в classpath сборки Maven 2 без их установки?
Я испытываю трудности с Maven 2 в процессе экспериментов и быстрого создания прототипов во время разработки.
У меня есть файл pom.xml
, который определяет зависимости для используемого мной веб-фреймворка, и я могу быстро генерировать стартовые проекты на основе этого файла. Однако иногда мне нужно подключить стороннюю библиотеку, у которой еще нет определенного файла pom.xml
. Вместо того чтобы вручную создавать файл pom.xml
для сторонней библиотеки, устанавливать его и добавлять зависимость в мой pom.xml
, я хотел бы просто сказать Maven: "В дополнение к моим определенным зависимостям, включайте также любые .jar-файлы, которые находятся в каталоге /lib
".
Это, кажется, должно быть проще, но если это так, я что-то упускаю.
Буду признателен за любые подсказки о том, как это сделать. В противном случае, если существует простой способ указать Maven на каталог /lib
и легко создать pom.xml
, в котором все содержащиеся .jar-файлы будут сопоставлены с одной зависимостью, которую я смогу затем назвать, установить и подключить одним махом, это также было бы весьма полезно.
5 ответ(ов)
Вот что я сделал, чтобы обойти проблему с зависимостями, и это работает с кодом, который был извлечен из репозитория.
Я создал новую папку в проекте, в моем случае я использовал repo
, но вы можете использовать src/repo
, если вам так удобнее.
В своем POM-файле у меня была зависимость, которая отсутствует в публичных 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 для z/OS Logstreams, файлов и др.</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>
Надеюсь, это поможет вам решить проблему с зависимостями!
Чтобы добавить или установить локальный JAR-файл в вашем проекте Maven, вы можете использовать следующий пример кода:
<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
, так как они обязательны для использования в разделе зависимостей. Убедитесь, что путь к вашему JAR-файлу корректен и существует в указанной директории.
Самым простым решением, на мой взгляд, будет настроить ваш maven-compiler-plugin
так, чтобы он включал ваши пользовательские JAR-файлы. Вот пример, который загружает все JAR-файлы из директории lib
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<includes>
<include>lib/*.jar</include>
</includes>
</configuration>
</plugin>
Таким образом, вы сможете использовать все необходимые библиотеки в вашем проекте.
После длительного обсуждения с представителями CloudBees о правильной упаковке таких JAR-файлов с помощью Maven они предложили интересное решение:
Создание «фейкового» Maven-проекта, который будет прикреплять уже существующий JAR в качестве основного артефакта, выполняя команду mvn install:install-file
. Пример POM-файла выглядит следующим образом:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.3.1</version>
<executions>
<execution>
<id>image-util-id</id>
<phase>install</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>${basedir}/file-you-want-to-include.jar</file>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<packaging>jar</packaging>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Однако для реализации данного подхода потребуется изменить существующую структуру проекта. Важно помнить, что для каждого такого JAR-файла должен быть создан отдельный «фейковый» Maven-проект (модуль). Также потребуется создать родительский Maven-проект, который будет включать все подмодули, а именно: обертки для всех JAR-файлов и основной проект. Структура может выглядеть следующим образом:
root project (содержит родительский POM-файл, который включает все подмодули с элементом *module* XML) (упаковка POM)
JAR 1 wrapper Maven child project (упаковка POM)
JAR 2 wrapper Maven child project (упаковка POM)
main existing Maven child project (упаковка WAR, JAR, EAR ....)
При запуске родительского проекта с помощью команд mvn install
или mvn package
будут выполняться также и подмодули. Это можно рассматривать как недостаток, поскольку структура проекта должна измениться, однако в конечном итоге это позволит получить более гибкое и динамичное решение.
Чтобы установить сторонний JAR-файл, который отсутствует в репозитории Maven, используйте плагин maven-install-plugin
.
Вот шаги, которые нужно выполнить:
Скачайте JAR-файл вручную с источника (веб-сайта).
Создайте папку и положите ваш JAR-файл в неё.
Выполните следующую команду, чтобы установить сторонний JAR-файл в ваш локальный репозиторий Maven:
mvn install:install-file -Dfile=<путь_к_файлу> -DgroupId=<ваш_groupId> -DartifactId=<ваш_artifactId> -Dversion=<ваша_версия> -Dpackaging=jar
Вот пример, который я использовал для log4j
от simonsite
:
mvn install:install-file -Dfile=/Users/athanka/git/MyProject/repo/log4j-rolling-appender.jar -DgroupId=uk.org.simonsite -DartifactId=log4j-rolling-appender -Dversion=20150607-2059 -Dpackaging=jar
В вашем
pom.xml
добавьте зависимость следующим образом:<dependency> <groupId>uk.org.simonsite</groupId> <artifactId>log4j-rolling-appender</artifactId> <version>20150607-2059</version> </dependency>
Запустите команду
mvn clean install
для создания пакета вашего проекта.
Дополнительная информация доступна в справочной статье: Maven: Установка сторонних JAR
Как создать исполняемый JAR-файл с зависимостями с использованием Maven?
Как указать Maven использовать последнюю версию зависимости?
Запуск одного тестового метода с помощью Maven
Eclipse/Java: не работает автозавершение кода
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки