Могу ли я добавить файлы jar в maven 2 buildpath без их установки?


700

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

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

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

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


Если вы используете NetBeans, просто выполните следующие действия: [Как установить модули в репозиторий Maven с помощью встроенного в NetBeans Maven?] [1] [1]: stackoverflow.com/a/339874/530153
Раджат Гупта

1
Я хочу указать, что эта ссылка stackoverflow.com/a/339874/530153, кажется, работает для установки jar по одному.
Пол

Ответы:


601

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

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

Почему вы не должны применять подход «Install to Local Repo»

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

Почему вы не должны применять подход «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.zMaven будет включать следующее местоположение в директории вашего проекта при поиске артефактов:

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>

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

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

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

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

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


3
Я всегда предполагал, что вы можете создать хранилище в проекте, наконец, подтвердил это, отлично!
Альбфан

19
Обратите внимание на две вещи: 1) Я рекомендую использовать «$ {project.baseUri} repo» вместо «file: // $ {project.basedir} / repo», чтобы получить RFC-совместимый URL-адрес также в Windows. 2) Если вы структурируете свой проект в подмодули, этот подход, похоже, потерпит неудачу, потому что $ {project.baseUri} разрешается в подкаталог модуля. Есть идеи, как решить эту проблему?
Оливер Ханаппи

8
Это почти привело меня к этому - но сценарий Никиты пытался быть слишком умным с плохо названными файлами JAR, которые у меня были. Поэтому я сделал упрощенную версию, которая не делает никаких предположений для groupId: github.com/carchrae/install-to-project-repo
Том Кэркра

3
такой блестящий ответ !! Есть 2 способа сделать что-то, правильный путь и способ, который работает, вы, сэр, делаете это правильно!
Panthro

1
здесь вы также найдете информацию о том, как автоматически сгенерировать артефакт из вашего файла jar: devcenter.heroku.com/articles/local-maven-dependencies
Dirk

486

Только для выброшенного кода

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

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


4
Спасибо, это действительно близко к тому, что я хочу. Любой способ добавить их все как одну запись? Скажем, у меня есть / lib с 10 банками, могу ли я как-то добавить их все, например, с /some/path/*.jar для systemPath? или мне все равно приходится относиться к каждому как к известной зависимости? Тем не менее, очень близко к тому, что мне нужно, спасибо!

11
используйте systemPath, например, такой: «<systemPath> $ {basedir} /lib/BrowserLauncher2-1_3.jar </ systemPath>« $ {basedir} указывает на корень вашего проекта.
Фредерик Морен

4
Лучше использовать проект. префикс в вашем пути, например, так: <systemPath> $ {project.basedir} /lib/AwesomeLib.jar </ systemPath>
Мэтью Маккалоу

76
Хотя я понимаю, что это то, о чем просил ФП, я все же хочу подчеркнуть, что использование systemприцела - это ужасная практика, которая настоятельно не рекомендуется . См. Зависимость + Области .
Паскаль Thivent

6
@marioosh Помните, что первоначальный замысел вопроса заключался в быстрых экспериментах. Если вы хотите сделать пакет mvn, установите jar в репозиторий.
Пиролистический

63

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

Например, если у вас есть 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


1
Вы отвечаете почти правильно. GroupId должен быть разбит на несколько подкаталогов.
Питер Фортуин

5
Конечно, если у вас сложный groupId, например com.foo.bar, ваша структура каталогов должна быть /com/foo/bar/artifactId/version/artifactId-verion.jar
Дмитрий Бойченко,

Значительно ли это отличается от ответа годом ранее ?
Джошуа Тейлор

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


15

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

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

Привет, вы поместили файлы pom в локальный репозиторий или рядом с файлами jar?
Пейманх

В вышеупомянутом решении это было рядом с файлами JAR. Имейте в виду, мне не нравится решение выше, потому что это слишком много работы.
Архимед Траяно

Я все еще предпочитаю решение, которое я разместил здесь stackoverflow.com/questions/2229757/…
Архимед Траяно,

Мне нравится такой подход, хотя я использовал плагин maven install для автоматизации установки jar в локальный репозиторий.
Карл Дж.

13

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


12

Вот так мы добавляем или устанавливаем локальный 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, потому что они являются обязательными :)


11

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


на самом деле он думает, что вам не нужно создавать pom для библиотеки, которую вы импортируете в локальный репозиторий
Фредерик Морин,

5
-1, иногда вы просто хотите добавить файл JAR без проблем его установки.
Леонель

8

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

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

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

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


Также видел maven-external-dependency-plugin, хотя non-maven-jar-maven-plugin кажется более простым в использовании.
Джесси Глик

8

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

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

  • Создайте repoкаталог в корневой папке:
yourproject
+ - pom.xml
+ - источник
+ - репо
  • Запустите это, чтобы установить 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>

6

После долгого обсуждения с ребятами из CloudBees правильной упаковки таких JAR-файлов они сделали интересное хорошее предложение для решения:

Создание фальшивого проекта Maven, который присоединяет ранее существовавший JAR в качестве основного артефакта и запускается в принадлежащую установку POM: выполнение установочного файла. Вот пример такого рода 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 и существующий основной проект. Структура может быть:

корневой проект (содержит родительский POM-файл, включающий все подмодули с модулем XML) (упаковка POM)

JAR 1 обертка Maven, детский проект (упаковка POM)

JAR 2 обертка Maven, детский проект (упаковка POM)

основной существующий детский проект Maven (WAR, JAR, EAR .... упаковка)

Когда родительский процесс выполняется через mvn: install или mvn: package принудительно, и субмодули будут выполнены. Это может рассматриваться как минус, так как структура проекта должна быть изменена, но в конце предлагает нестатическое решение.


Просто наблюдение, но я не думаю, что вам нужно создавать новый POM для каждого JAR, который вы хотите добавить. Этого должно быть достаточно для создания одного POM, чтобы добавить все JAR-файлы, если у вас есть блок выполнения для каждого jar-файла, который вы хотите добавить. Вам просто нужно убедиться, что каждый блок имеет уникальный идентификатор. В результате получается один модуль Maven, который добавит все JAR-файлы в локальный репозиторий. (Просто убедитесь, что координаты maven не конфликтуют ни с чем, что уже может быть там или может быть добавлено позже!)
Stormcloud

Hero. Это именно то, что я хотел. Хороший парень. 2013 должен был быть хорошим годом;)
ndtreviv

5

Что мне кажется самым простым, так это просто настроить плагин 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>

1
Если я добавлю этот Maven says nothing to complile!
Рави Парех

Это говорит, all classes are up to date nothing to compileпотому что больше не будет искать *.java. Вы можете добавить их обратно, используя <include>**/*.java</include>. Пока что у меня нет успеха для банок
Майкл

@ Imiguelmh, есть ли причина, почему это не работает для банок?
Кисна

4

Проблема systemPathв том, что банки зависимостей не будут распределяться по вашим артефактам как транзитивные зависимости. Попробуйте то, что я написал здесь: лучше ли Mavenize файлы вашего проекта JAR или поместить их в WEB-INF / lib?

Затем объявите зависимости как обычно.

И, пожалуйста, прочитайте примечание нижнего колонтитула.


3

Странное решение я нашел:

используя Eclipse

  • создать простой (не maven) проект Java
  • добавить основной класс
  • добавить все банки в classpath
  • экспорт Runnable JAR (это важно, потому что здесь нет другого способа сделать это)
  • выберите Извлечь необходимые библиотеки в сгенерированный JAR
  • решить вопросы лицензии
  • tadammm ... установите сгенерированную банку на свой m2repo
  • добавьте эту единственную зависимость к другим вашим проектам.

ура, Балинт


3

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

Добавьте запись о зависимости для каждого необходимого вам jar-файла, желательно с помощью perl-скрипта или чего-то подобного, и скопируйте / вставьте его в ваш pom-файл.

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";

Да, это именно то, что я искал. Способ протолкнуть его для исследования кода тестирования. Ничего фантастического. Да, я знаю, это то, что они все говорят :) Различные решения для плагинов maven кажутся излишними для моих целей. У меня есть несколько банок, которые мне дали как сторонние библиотеки с файлом pom. Я хочу, чтобы он быстро компилировался / запускался. Это решение, которое я тривиально адаптировал к python, творило чудеса для меня. Вырезать и вставить в мой пом.
Пол

3

Быстрое и грязное решение партии ( на основе ответа Алекса):

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

Выполнить это так: libs.bat > libs.txt. Затем откройте libs.txtи скопируйте его содержимое как зависимости.

В моем случае мне нужны были только библиотеки для компиляции моего кода, и это решение было лучшим для этой цели.


2

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

  1. Банки, которые нельзя найти в онлайн-хранилище maven, должны быть в SVN.
  2. Если один разработчик добавляет другую библиотеку, другим разработчикам не следует беспокоиться об их ручной установке.
  3. Среда IDE (в моем случае NetBeans) должна найти источники и javadoc для автозаполнения и помощи.

Давайте сначала поговорим о (3): просто не будет работать с банками в папке и как-то объединять их в финальную банку, поскольку среда IDE не поймет этого. Это означает, что все библиотеки должны быть установлены правильно. Однако я не хочу, чтобы все устанавливали его с помощью "mvn install-file".

В моем проекте мне понадобился мета-виджет. Вот так:

  1. Создайте новый проект Maven (назовите его «shared-libs» или что-то в этом роде).
  2. Загрузите metawidget и распакуйте zip в src / main / lib.
  3. Папка doc / api содержит Javadocs. Создайте почтовый индекс содержимого (doc / api / api.zip).
  4. Изменить пом как это
  5. Постройте проект, и библиотека будет установлена.
  6. Добавьте библиотеку в качестве зависимости к вашему проекту или (если вы добавили зависимость в проекте shared-libs) добавьте shared-libs в качестве зависимости, чтобы получить все библиотеки одновременно.

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


Возможно, вы захотите проверить Maven: добавить зависимость к банке по относительному пути (что, IMHO, является лучшей альтернативой).
Паскаль Thivent

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

В моем ответе есть способ рассказать pom.xml о банке внутри вашего проекта. Почему бы просто не сделать это и не указать на jars в $ {basedir} / lib?
Эд Браннин

1
@Ed Поскольку это не совсем то, для чего предназначена системная область, зависимости области видимости имеют много побочных эффектов. Это ужасная практика, которая должна быть полностью запрещена.
Паскаль Thivent

2

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

Ниже приведены шаги:

  1. Скачать JAR-файл вручную с источника (веб-сайт)
  2. Создайте папку и поместите в нее свой файл jar
  3. Запустите приведенную ниже команду, чтобы установить сторонний jar в локальный репозиторий maven.

mvn install: install-file -Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =

Ниже приведен пример, который я использовал для simonsite log4j

mvn install: install-file -Dfile = / Пользователи / athanka / git / MyProject / repo / log4j-Rolling-Appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-Rolling-Appender -Dversion = 20150607-2059 - Dpackaging = баночка

  1. В pom.xml включите зависимость как показано ниже

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
  2. Запустите команду mvn clean install, чтобы создать упаковку

Ниже ссылка ссылка:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


Это только пограничный ответ . Вы должны расширить свой ответ, чтобы включить сюда как можно больше информации, и использовать ссылку только для справки.
До свидания StackExchange

2

Для тех, кто не нашел здесь хорошего ответа, это то, что мы делаем, чтобы получить банку со всеми необходимыми зависимостями. В этом ответе ( https://stackoverflow.com/a/7623805/1084306 ) упоминается использование подключаемого модуля Maven Assembly, но в действительности не приводится пример ответа. И если вы не прочитали весь путь до конца ответа (он довольно длинный), вы можете пропустить его. Добавление ниже к вашему pom.xml сгенерируетtarget/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>

1

Я сослался на некоторый код на python в комментарии к ответу @alex lehmann's, поэтому выкладываю его здесь.

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

0

Это не ответ на вопрос, как добавить их к вашему POM, и, может быть, не представляет никакой сложности, но просто добавит lib dir к вашей работе с classpath? Я знаю, что это то, что я делаю, когда мне нужна внешняя банка, которую я не хочу добавлять в свои репозитории Maven.

Надеюсь это поможет.


1
Это то, что я делал, и это работает, но это также загрязняет глобальный путь классов, и я пытаюсь уйти от этого. Спасибо!

@purple Точно, как ты это сделал?
TheRealChx101

0

В нашем проекте работает то, что написал Архимед Траяно, но в нашем файле .m2 / settings.xml было что-то вроде этого:

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

и * следует изменить на центральный. Так что, если его ответ не работает для вас, вы должны проверить ваши settings.xml


0

Я просто хотел быстрый и грязный обходной путь ... Я не мог запустить скрипт от Никиты Волкова: синтаксическая ошибка + требуется строгий формат для имен банок.

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

Если вы хотите использовать его, убедитесь, что вы понимаете, что делает скрипт, вам может потребоваться изменить libпапку и значение для groupIdили artifactId...

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '>', 'dependencies.xml') or die "Could not open file 'dependencies.xml' $!";
foreach my $file (glob("lib/*.jar")) {
    print "$file\n";
    my $groupId = "my.mess";
    my $artifactId = "";
    my $version = "0.1-SNAPSHOT";
    if ($file =~ /\/([^\/]*?)(-([0-9v\._]*))?\.jar$/) {
        $artifactId = $1;
        if (defined($3)) {
            $version = $3;
        }
        `mvn install:install-file -Dfile=$file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar`;
        print $fh "<dependency>\n\t<groupId>$groupId</groupId>\n\t<artifactId>$artifactId</artifactId>\n\t<version>$version</version>\n</dependency>\n";
        print " => $groupId:$artifactId:$version\n";
    } else {
        print "##### BEUH...\n";
    }
}
close $fh;

0

Решение для подхода scope = 'system' в Java:

public static void main(String[] args) {
        String filepath = "/Users/Downloads/lib/";
        try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {

        List<String> result = walk.filter(Files::isRegularFile)
                .map(x -> x.toString()).collect(Collectors.toList());

                String indentation = "    ";
                for (String s : result) {
                    System.out.println(indentation + indentation + "<dependency>");
                    System.out.println(indentation + indentation + indentation + "<groupId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</groupId>");
                    System.out.println(indentation + indentation + indentation + "<artifactId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</artifactId>");
                    System.out.println(indentation + indentation + indentation + "<version>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</version>");
                    System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
                    System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
                    System.out.println(indentation + indentation + "</dependency>");
                }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.