Как объединить модули в одну банку в Maven2?

У меня есть проект maven2 с несколькими модулями jar, сборка проекта получит .jar-архивы для каждого модуля в модулях каталога /XYZ/target/XYZ -x.x.x.jar

Теперь, если мой проект P имеет версию P-p.q.r, и я хочу сгенерировать один барабан P-p.q.r-all.jar со всеми включенными подмодулями, как мне это сделать?

Ответы

Ответ 1

То, что вы хотите достичь, называется uber jar. Этот модуль должен иметь зависимость от всех других подмодулей, которые вы хотите упаковать в одну банку. Если вы создадите еще один подмодуль, который будет генерировать желаемый артефакт, он может быть построен в реакторе со всеми его зависимостями, но если это будет отдельный проект, который вы должны установить для всех элементов uber jar dependecies.

| parent
| -- submodule1
...
| -- submoduleN
| -- uberjarSubmodule

Uber jar можно сделать, используя:

  • maven-shade-plugin - в вашем случае вы должны помнить об исключении транзитивных зависимостей из ваших модулей

    <project>
    ...
    <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.2.2</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <excludes>
                  <exclude>classworlds:classworlds</exclude>
                  <exclude>junit:junit</exclude>
                  <exclude>jmock:jmock</exclude>
                  <exclude>xml-apis:xml-apis</exclude>
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
    </build>
    ...
    </project>
    
  • maven-assembly-plugin - в этом вопросе вы будете найти подробный ответ

Ответ 2

В зависимости от того, как вы собираетесь отправить это, если ваша банка - это библиотека, которую вы хотите, чтобы другие разработчики загружали и использовали через maven. Вы должны указать их как зависимости в проектах pom.

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