Добавить артефакт jar-with-dependencies из другого модуля Maven

У меня есть мультимодульный проект Maven. Один из модулей отвечает за упаковку результатов всех других модулей в один результат. В настоящее время я сталкиваюсь с проблемой, когда моя сборка не может собрать выходные данные из других модулей, в результате чего появляется сообщение:

[WARNING] The following patterns were never triggered in this artifact 
  inclusion filter:
o  '*:a'

Упрощенная версия макета моего проекта показана ниже, где moduleA это проект, который создает стандартный вывод JAR-с-зависимостями и moduleB мой модуль отвечает за упаковку. Корневой уровень pom.xml списки moduleA а также moduleB как модули.

parent
|- moduleA (foo:a)
   |- pom.xml
   |-src
     |- ...   
|- moduleB (foo:b)
   |- pom.xml
   |- src
      |- main
         |- assembly
            |- assembly.xml
|- pom.xml

Я создал дескриптор сборки для moduleB что в настоящее время выглядит так:

<assembly>
  <id>dist</id>
  <formats>
    <format>tar.gz</format>
  </formats>

  <moduleSets>
    <moduleSet>
      <includes>
        <include>*:a</include>
      </includes>
      <binaries>
        <attachmentClassifier>jar-with-dependencies</attachmentClassifier>
        <outputDirectory>package</outputDirectory>
        <dependencySets>
          <dependencySet>
            <excludes>
              <exclude>*:*</exclude>
            </excludes>
          </dependencySet>
        </dependencySets>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>

Я также перечислил moduleA как зависимость moduleB в moduleB"s pom.xml файл (область компиляции). Я сделал это, потому что я верю, что это заставит moduleB быть построенным после moduleA; кажется, работает.

Может кто-нибудь подсказать, почему мой moduleB Сборка не собирает вывод JAR-с-зависимостями из moduleA и жаловаться на то, что шаблон никогда не срабатывает?

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

<assembly>
  <id>dist</id>
  <formats>
    <format>tar.gz</format>
  </formats>

  <moduleSets>
    <moduleSet>
      <includes>
        <include>foo:a</include>
      </includes>
      <binaries>
        <outputDirectory>package</outputDirectory>
        <dependencySets></dependencySets>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>

NEW: SSCCE для этой проблемы можно найти здесь: http://dl.dropbox.com/u/108474287/parent.zip

Maven версия: Apache Maven 2.2.1 (r801777; 2009-08-06 20:16:01+0100)

3 ответа

Решение

Я думаю, что проблема в том, что у вас есть многомодульный проект, и вы пытаетесь иметь <moduleSet/> ссылаясь на родного брата. Из бинарных файлов модуля "Включение" вы можете найти этот текст:

Новый (начиная с 2.2) флаг useAllReactorProjects в разделе moduleSet позволяет использовать двоичные модули модулей из дочерних модулей в многомодульной сборке. Это важно для разрешения конфликта между порядком сборки Maven и старым подходом к двоичным файлам модулей, где сборка была собрана из родительского POM.

Поэтому я обновил файл вашей сборки до этого (добавил <useAllReactorProjects/>) и получил это работает:

<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>dist</id>
    <formats>
        <format>tar.gz</format>
    </formats>

    <moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>
            <includes>
                <include>*:a</include>
            </includes>
            <binaries>
                <outputDirectory>package</outputDirectory>
                <dependencySets>
                    <dependencySet>
                        <excludes>
                            <exclude>*:*</exclude>
                        </excludes>
                    </dependencySet>
                </dependencySets>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

NB Я удалил тег <attachmentClassifier>jar-with-dependencies</attachmentClassifier> так как это совершенно неправильно.

Выход является .tar.gz что я думаю, что вы хотите достичь, хотя это jar-with-dependencies несколько указывает в другом направлении. Мне не очень понятно, что вы хотите...


Альтернатива maven-assembly-plugin может быть использовать maven-shade-plugin,

В моем случае я пропустил включение этого модуля в качестве зависимости в POM и включил только в src.xml. Это просто еще одно место, чтобы посмотреть, если вы столкнулись с проблемой.

Согласно документации Maven, с учетом следующей структуры проекта и всех соответствующих ссылок на модули в родительском POM:

+ parent (groupId: org.test, artifactId: parent)
  |
  + child1 (groupId: org.test, artifactId: child1)
  |
  + child2 (groupId: org.test, artifactId: child2)

Мы можем выбрать только модуль child1, используя следующий модуль module:

<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">
  [...]
  <moduleSets>
    [...]
    <moduleSet>
      <includes>
        <include>org.test:child1</include>
      </includes>
    </moduleSet>
  </moduleSets>
  [...]
</assembly>

Я никогда не использовал подстановочные знаки в опции include, можете ли вы упомянуть пакет вместо подстановочного знака?

Другие вопросы по тегам