7

Можно ли добавить JAR-файлы в classpath сборки Maven 2 без их установки?

9

Я испытываю трудности с Maven 2 в процессе экспериментов и быстрого создания прототипов во время разработки.

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

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

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

5 ответ(ов)

0

Вот что я сделал, чтобы обойти проблему с зависимостями, и это работает с кодом, который был извлечен из репозитория.

Я создал новую папку в проекте, в моем случае я использовал 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>

Надеюсь, это поможет вам решить проблему с зависимостями!

0

Чтобы добавить или установить локальный 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-файлу корректен и существует в указанной директории.

0

Самым простым решением, на мой взгляд, будет настроить ваш 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>

Таким образом, вы сможете использовать все необходимые библиотеки в вашем проекте.

0

После длительного обсуждения с представителями 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 будут выполняться также и подмодули. Это можно рассматривать как недостаток, поскольку структура проекта должна измениться, однако в конечном итоге это позволит получить более гибкое и динамичное решение.

0

Чтобы установить сторонний JAR-файл, который отсутствует в репозитории Maven, используйте плагин maven-install-plugin.

Вот шаги, которые нужно выполнить:

  1. Скачайте JAR-файл вручную с источника (веб-сайта).

  2. Создайте папку и положите ваш JAR-файл в неё.

  3. Выполните следующую команду, чтобы установить сторонний 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
  1. В вашем pom.xml добавьте зависимость следующим образом:

    <dependency>
        <groupId>uk.org.simonsite</groupId>
        <artifactId>log4j-rolling-appender</artifactId>
        <version>20150607-2059</version>
    </dependency>
    
  2. Запустите команду mvn clean install для создания пакета вашего проекта.

Дополнительная информация доступна в справочной статье: Maven: Установка сторонних JAR

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