Могу ли я добавить файлы 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 ]

6 голосов
/ 17 января 2013

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

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

JAR 1 обертка Maven child project (упаковка POM)

JAR 2-упаковщик Maven child project (упаковка POM)

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

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

4 голосов
/ 06 июля 2011

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

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

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

3 голосов
/ 21 апреля 2011

Если вы хотите быстрое и грязное решение, вы можете сделать следующее (хотя я не рекомендую это ни для чего, кроме тестовых проектов, 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>
";
3 голосов
/ 14 мая 2016

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

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 и скопируйте его содержимое как зависимости.

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

3 голосов
/ 04 февраля 2016

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

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

с использованием Eclipse

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

ура, Балинт

2 голосов
/ 18 сентября 2010

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

  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. Создайте ZIP-архив содержимого (doc / api / api.zip).
  4. Изменить пом , как это
  5. Постройте проект, и библиотека будет установлена.
  6. Добавьте библиотеку в качестве зависимости к вашему проекту или (если вы добавили зависимость в проекте shared-libs) добавьте shared-libs в качестве зависимости, чтобы получить все библиотеки одновременно.

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

2 голосов
/ 07 октября 2016

Для тех, кто не нашел здесь хорошего ответа, это то, что мы делаем, чтобы получить банку со всеми необходимыми зависимостями. В этом ответе (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>
2 голосов
/ 06 октября 2016

Чтобы установить сторонний 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 = / Users / athanka / git / MyProject / repo / log4j-Rolling-Appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-Rolling-Appender

  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

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

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

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

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