Может ли 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>
)
Ответы
Ответ 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/