Может ли Maven собрать все зависимые файлы JAR для проекта, чтобы помочь с развертыванием приложения? - PullRequest
51 голосов
/ 20 февраля 2009

Я только начинаю использовать Maven , (на самом деле оценивая это), и мне нужно иметь возможность быстро сгенерировать файл JAR для моего приложения и каталог со всеми зависимости (например, lib), так что я могу развернуть эти два для автономного запуска. Создать файл JAR с правильным манифестом легко, но я не знаю, как заставить Maven скопировать зависимости для текущего проекта в каталог lib, который я могу развернуть.

Так как это для автономных приложений Java, я не заинтересован в развертывании в репозиторий Maven, который также является довольно тривиальным или, по крайней мере, легко доступным для Google.

Я узнал, как сделать все , кроме , скопировать зависимые JAR-файлы в какой-то указанный каталог. Это рабочий процесс, который я ищу:

$ mvn clean
$ mvn package
$ cp -r target/{lib,myApp.jar} installLocation

Затем, запуск myApp.jar из installLocation в виде файла JAR должен "просто работать" независимо от моего $CLASSPATH.

Чтобы попытаться упредить некоторые ответы:

  • У меня есть Main-class: set, и он отлично работает.
  • Я также установил classpath в MANIFEST.MF, и это тоже отлично работает.
  • Я узнал, как использовать <classpathPrefix> и <classpathMavenRepositoryLayout>, чтобы это работало - но только на моей машине. (через: <classpathPrefix>${settings.localRepository}</classpathPrefix>)

Ответы [ 6 ]

81 голосов
/ 20 февраля 2009

Что вы хотите исследовать, это Плагин зависимости Maven . Добавьте что-то похожее на следующее в pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <configuration>
        <outputDirectory>
            ${project.build.directory}
        </outputDirectory>
    </configuration>
</plugin>

Затем запустите mvn clean dependency:copy-dependencies, чтобы скопировать, выполнить копирование. Добавьте к этому плагин сборки , и вы можете упаковать все в отдельный архив для распространения.

9 голосов
/ 02 февраля 2013

Мне не понравился плагин Shade, поскольку он сворачивает все пакеты из всех банок вместе.

Чтобы включить все внешние библиотеки, вы можете использовать плагин зависимости, как упомянуто выше.

Этот пример создаст каталог "lib" в папке "target / classes" перед фазой "package".

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.6</version>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>target/classes/lib</outputDirectory>
        <overWriteIfNewer>true</overWriteIfNewer>
        <excludeGroupIds>
          junit,org.hamcrest,org.mockito,org.powermock,${project.groupId}
        </excludeGroupIds>
      </configuration>
    </execution>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>sources</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <verbose>true</verbose>
    <detail>true</detail>
    <outputDirectory>${project.build.directory}</outputDirectory>
  </configuration>
</plugin>
7 голосов
/ 21 февраля 2009

Еще один плагин appassembler
Что мне нравится в этом, так это то, что оно упаковывает приложение в готовой к использованию форме (с файлом .bat и таким)

4 голосов
/ 16 декабря 2015

Взгляните на плагин зависимостей maven, в частности цель копирования-зависимостей. В разделе об использовании описано, как делать именно то, что вы хотите.

Чтобы сделать это из командной строки, просто выполните:

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR
3 голосов
/ 20 февраля 2009

Конечно, можно. Вам нужно использовать плагин shade , что можно сделать, добавив

     <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.3-SNAPSHOT</version>
        <configuration>
          <!-- put your configurations here -->
        </configuration>
      </plugin>

к вашему проекту.

0 голосов
/ 17 августа 2016

Используя maven.repo.local можно собрать все файлы jar, но они собраны в каталог с иерархией maven (.m2).

mvn install -Dmaven.repo.local=./pick/some/folder

Затем вы можете собрать их (в Linux):

mkdir flat-repo
find ./pick/some/folder -type f -name "*.jar" | xargs -I'{}' cp '{}' flat-repo/
...