2009-02-20 3 views
47

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

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

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

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

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

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

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

ответ

73

Что вы хотите изучить, это Maven's dependency plugin. Добавить что-то похожее на следующее: 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 скопировать выполнить копию. Объедините это с assembly plugin, и вы можете упаковать все в автономный архив для распространения.

+0

Добавлено это мой pom.xml внутри Eclipse. Ничего не происходит –

+0

Мне пришлось скачать maven за пределами eclipse, добавлена ​​папка/bin на мой путь, а затем запущена 'mvn dependency: copy-dependencies'. ДА! Теперь это работает, Maven делает то, что он должен делать! Теперь просто скопируйте все * .jar в мой проект и добавьте в мой путь сборки –

3

Это обязательно. Вы должны использовать shade plugin, который может быть сделано путем добавления

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

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

6

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

7

Я не ухаживаю за тенью плагина, так как он свертывает все пакеты со всех банок вместе.

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

В этом примере создается «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> 
2

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

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

$ mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR 
-1

Использование 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/