Может ли Maven собрать все зависимые JAR для проекта, чтобы помочь с развертыванием приложения? - программирование
Подтвердить что ты не робот

Может ли Maven собрать все зависимые JAR для проекта, чтобы помочь с развертыванием приложения?

Я только начинаю использовать Maven, (оценивая его, действительно), и мне нужно иметь возможность быстро генерировать < файл href= "http://en.wikipedia.org/wiki/JAR_file" rel= "noreferrer" > JAR для моего приложения и каталог со всеми зависимостями (например, lib), чтобы я мог развернуть эти два, которые будут выполняться в автономно. Генерация JAR файла с соответствующим манифестом проста, но я не знаю, как заставить Maven скопировать зависимости для текущего проекта в каталог lib, который я могу развернуть.

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

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

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

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

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

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

Ответ 1

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

Ответ 2

Мне не нравился плагин 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>

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR

Ответ 6

Используя maven.repo.local, можно собрать все банки, но они собраны в каталог с иерархией 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/