Многомодульный проект maven: могу ли я использовать jar с зависимостями?

У меня есть проект maven с основным проектом A и модулями B и C. Дети наследуют от pom A.

A
|
|----B
|    |----pom.xml
|
|----C
|    |----pom.xml
| 
|----pom.xml

Он уже создает банки для всех модулей. Есть ли способ включить зависимости в эти банки? Например. так что я получаю B-1.0-with-dependencies.jar и C-1.0-with-dependencies.jar? Я попытался установить

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

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

Я бы не хотел помещать что-то в каждый дочерний помпон, так как на самом деле у меня более 2 модулей. Я уверен, что есть какой-то способ сделать это, но не могу понять это из документов maven. Спасибо!


person Wisco crew    schedule 09.12.2015    source источник


Ответы (1)


Вот как я это сделал.
В агрегаторе/родительском pom я настроил:

<properties>
    <skip.assembly>true</skip.assembly>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <skipAssembly>${skip.assembly}</skipAssembly>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Обратите внимание на свойство skip.assembly, которое по умолчанию имеет значение true. Это означает, что сборка не будет выполняться на родительском элементе, что имеет смысл, поскольку родитель не предоставляет никакого кода (с упаковкой pom).

Затем в каждом модуле я настроил просто следующее:

<properties>
    <skip.assembly>false</skip.assembly>
</properties>

Это означает, что в каждом подмодуле пропуск отключен, и сборка выполняется так, как настроено в родительском модуле. Более того, при такой конфигурации можно также легко пропустить сборку определенного модуля (если требуется).

Также обратите внимание на конфигурацию сборки для родителя. Я добавил execution поверх предоставленной вами конфигурации, чтобы подключаемый модуль сборки запускался автоматически при вызове mvn clean package (или mvn clean install).

person A_Di-Matteo    schedule 09.12.2015
comment
Фантастика! Одно замечание для всех, кто сталкивался с этим: я хотел скопировать банки в директорию target/ основного уровня, используя <classifier>jar-with-dependencies</classifier>. Для этого мне пришлось поместить плагин maven-assembly-plugin перед плагином maven-dependency в родительском pom, иначе jar-with-dependencies не был создан до того, как maven попытался его скопировать. Не знал, что порядок плагинов имеет значение! - person Wisco crew; 10.12.2015
comment
Это не сработало для меня. Я использую плагин сборки v3.1. Любая идея, почему это может быть так? - person Ahmed Moawad; 03.03.2018
comment
Это сработало, когда я использовал: mvn clean compile assembly:single вместо mvn package. Может этап сборки не был связан с этапом упаковки, я не уверен. - person Ahmed Moawad; 03.03.2018
comment
@AhmedMoawad, создающий мой проект с помощью mvn clean compile assembly:single, дает мне Error reading assemblies: No assembly descriptors found.. Сборка с mvn clean package дает мне JAR-файлы с зависимостями, но без моих исходников... Это проект Kotlin, но когда не было родителя, он работал нормально. - person Jezor; 28.07.2019