Добавить артефакт 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, можете ли вы упомянуть пакет вместо подстановочного знака?