Мультимодульный проект Maven - копирование всех «пакетных» JARS из подмодулей в parent / target / - PullRequest
30 голосов
/ 28 ноября 2011

У меня есть проект 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 лучше?

Ответы [ 3 ]

27 голосов
/ 28 ноября 2011

Вы можете попробовать плагин maven-dependency-plugin: copy : цель.

Вам нужно будет добавить это в список всех подмодулей, которые вы хотите скопировать.РЕДАКТИРОВАТЬ: Или просто в родительском пом (см. Комментарии).

    <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>

Если вы поместите это в родительский пом, имейте в виду, что это будет хорошо работать, только если весь ваш проект на один модуль глубже.Это означает, что если модули под родительским модулем имеют свои собственные подмодули, они не попадут в нужную папку.Структура вашей папки будет выглядеть следующим образом:

- Parent
  - Module 1
    - Sub module 1
    **Main**
  - Module 2
  **Main**

Чтобы предотвратить это, создайте выделенный модуль с вышеуказанной конфигурацией и укажите вручную каждый модуль, который вы хотите скопировать.Таким образом, все модули, независимо от их глубины, окажутся в одной папке.

15 голосов
/ 21 марта 2013

Я потратил целый день, пытаясь решить эту проблему ... и, наконец, это работает, поэтому, хотя у меня сложный график, я поделюсь им здесь, если только смогу спасти чье-то разочарование в будущем ...

Шаг 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 в родительском проекте.Bam!

PS Выше предполагается, что все проекты находятся в одном каталоге (родительский проект рядом с дочерними), но вы можете изменить относительные пути по своему желанию.

3 голосов
/ 28 ноября 2011

Одним из способов достижения этого было бы использование опции 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>
...