Подтвердить что ты не робот

Многомодовый проект 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?

4b9b3361

Ответ 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>