Многомодовый проект Maven - копирование всех "пакетов" JARS из подмодулей в родительские/целевые/
У меня есть проект maven с несколькими подмодулями. Я ищу способ получить все файлы .jar, созданные подмодулями, включенными в агрегирующий каталог POM/target/, поэтому их можно удобно использовать впоследствии.
- Их не нужно объединять. Предпочтительно нет, но если они должны быть тогда, это нормально.
- Не заботьтесь о зависимостях
- Это в первую очередь для удобства, на данный момент
Базовая версия того, что я ищу:
Prj1/pom.xml => prj1/target/proj1.jar (and classes/generated-sources/etc)
Prj2/pom.xml => prj2/target/proj2.jar
Main/pom.xml =>
main/target/proj1.jar
main/target/proj2.jar
... classes/generated-sources not needed at all,
... but they could be combined here. I assume they will be
Я читал и использовал некоторые предложения от SO. Пока я не нашел способ сделать это, но я уверен, что он есть.
изменить
Я отказался от того, чтобы это работалось простым способом, для всех включенных подпрограмм. Лучший ответ, который у меня есть до сих пор, - это использовать плагин зависимостей вручную, чтобы указать (снова), каждый включенный подмодуль. Идея заключалась в том, чтобы легко настроить POM для десятков клиентов, просто включив необходимые модули, а затем замаскировав все блоки подмодулей в одном месте. Maven довольно приятный, когда вы мало что с этим делаете, но налог с углового кронштейна невероятен, когда вы пытаетесь.
Мне все еще кажется странным, что такие стандартные задачи (судя по вопросам, задаваемым по SO, и к какому нормальному проекту), настолько сложны. Улучшено ли maven3?
Ответы
Ответ 1
Вы можете попробовать плагин maven-dependency-plugin: copy: цель.
Вам придется добавить это в pom всех подмодулей, которые вы хотите скопировать.
EDIT: Или просто в родительском помпе (см. Комментарии).
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-artifact</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>${project.packaging}</type>
</artifactItem>
</artifactItems>
<outputDirectory>../Main/target/dependencies</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Если вы поместите это в родительский pom, имейте в виду, что он будет работать хорошо, только если весь ваш проект является одним модулем. Это означает, что если модули под родительским модулем имеют свои собственные подмодули, они не попадут в нужную папку. Структура вашей папки будет выглядеть следующим образом:
- Parent
- Module 1
- Sub module 1
**Main**
- Module 2
**Main**
Чтобы предотвратить это, создайте выделенный модуль с указанной выше конфигурацией и укажите вручную каждый модуль, который вы хотите скопировать. Таким образом, все модули, независимо от того, насколько они глубоки, попадут в одну папку.
Ответ 2
Я потратил целый день на то, чтобы решить эту проблему... и, наконец, это работает, поэтому, хотя я нахожусь в жестком графике, я поделюсь им здесь, если я могу только сохранить кого-то разочарование в будущем...
Шаг 1. Создайте дополнительный проект Maven, который будет родителем всех проектов, которые вы хотите скопировать. Позвольте назвать этот проект parent
.
Этот проект необходим, чтобы сообщить Maven, который собирается строить вместе. Кроме того, вы укажете в своих других проектах, что их родительский элемент parent
, поэтому они будут видеть свойство MyDir
, которое вы определяете здесь.
<groupId>com.your.domain</groupId>
<artifactId>parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<properties>
<MyDir>/your/path/to/copy/to</MyDir>
</properties>
<modules>
<module>../project1</module>
<module>../project2</module>
<module>../project2</module>
</modules>
Шаг 2. Для каждого проекта, который вы хотите скопировать в одно и то же место, укажите, что он является проектом parent
(убедитесь, что вы указали правильные groupId и artifactId и версию вашего родительского проекта):
<parent>
<groupId>com.your.domain</groupId>
<artifactId>parent</artifactId>
<version>0.0.1</version>
<relativePath>../parent</relativePath>
</parent>
А также для каждого из этих проектов также укажите параметры плагина jar и зависимостей, например:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<outputDirectory>${MyDir}</outputDirectory>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.your.domain.Program</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${MyDir}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Затем просто запустите mvn install
в родительском проекте. Бам!
P.S. Вышеприведенное предполагает, что все проекты расположены в одном каталоге (родительский проект рядом с дочерними элементами), но вы можете изменить относительные пути по своему желанию.
Ответ 3
Одним из способов достижения этой цели будет использование опции moduleSet Плагин сборки maven.
Вы можете создать дескриптор сборки, подобный этому (вариант примера в ссылке) и использовать его в объявлении плагина сборки в pom.
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<moduleSets>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<binaries>
<outputDirectory>/</outputDirectory>
<unpack>false</unpack>
</binaries>
</moduleSet>
</moduleSets>
</assembly>