Maven Assembly Plugin выполняется на дочерних проектах - PullRequest
4 голосов
/ 04 мая 2011

У меня следующая проблема.У меня есть многомодульный проект.Я хочу запустить плагин maven-assembly на pom верхнего уровня, который также является родительским 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>src</id>
<formats>
    <format>zip</format>
</formats>
<moduleSets>
    <moduleSet>
        <includeSubModules>true</includeSubModules>
        <sources>
            <useDefaultExcludes>true</useDefaultExcludes>
            <includeModuleDirectory>false</includeModuleDirectory>
            <fileSets>
                <fileSet>
                    <outputDirectory>/</outputDirectory>
                    <useDefaultExcludes>true</useDefaultExcludes>
                    <includes>
                        <include>src/main/**</include>
                        <include>src/test/**</include>
                        <include>target/classes/**</include>
                    </includes>
                </fileSet>
            </fileSets>
        </sources>
    </moduleSet>
</moduleSets>

Файл pom выглядит следующим образом:

<?xml version="1.0"?>
<project
      xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
      >

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>myid</groupId>
    <artifactId>myartid</artifactId>
    <version>1.1</version>
</parent>
<groupId>myid2</groupId>
<artifactId>TopLevelBuild</artifactId>
<packaging>pom</packaging>
<version>5.5-SNAPSHOT</version>
<name>Some Application</name>
<modules>
    <module>1</module>
    <module>2</module>
    <module>3</module>
    <module>4</module>
    <module>5</module>
    <module>6</module>
</modules>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit-dep</artifactId>
        <version>4.8.2</version>
        <scope>compile</scope>
    </dependency>
</dependencies>
</project>

Родительский pom просто содержит некоторые зависимости, которые я хочу наследовать во всех модулях.Подмодули имеют текущий pom в качестве родителя.Теперь, если я запускаю:

сборка mvn: single -Ddescriptor = somedes.xml

, она работает нормально на уровне верхнего уровня и собирает все необходимые мне источники.Но он не останавливается и не начинает выполнять эту цель для всех подпроектов, и, конечно, для этого дескриптора не определено.Как я могу принудительно выполнить только на pom верхнего уровня?

...
[INFO] Processing sources for module project: LAST MODULE
[INFO] Building zip: ..../target/TopLevelBuild-5.5-SNAPSHOT-src.zip
[INFO] ------------------------------------------------------------------------
[INFO] Building deploy
[INFO]    task-segment: [assembly:single]
[INFO] ------------------------------------------------------------------------
[INFO] [assembly:single {execution: default-cli}]
[INFO] Processing sources for module project: module1-submodule1:jar:5.5-SNAPSHOT
[INFO] Processing sources for module project: module1-submodule1:jar:5.5-SNAPSHOT
[INFO] Building zip: .../module1/target/module1-5.5-SNAPSHOT-src.zip
[INFO] ------------------------------------------------------------------------
[INFO] Building module1
[INFO]    task-segment: [assembly:single]
[INFO] ------------------------------------------------------------------------
[INFO] [assembly:single {execution: default-cli}]
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to create assembly: Error creating assembly archive src: You must set at least one file.

Я пытался добавить:

-Dexecution.inherited = false

но это не помогает. Добавление

-Dassembly.ignoreMissingDescriptor = true

также не помогло.Есть идеи?

Ответы [ 5 ]

8 голосов
/ 31 января 2012

Поместите это в конфигурацию maven-assembly-plugin, в родительском pom.

<runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
3 голосов
/ 07 декабря 2011

-Dassembly.runOnlyAtExecutionRoot = истина

Это свойство, которое заставляет его работать как описано.

2 голосов
/ 19 августа 2011

Вы правы, вы пытались использовать param "-Dexecution.inherited=false".

Я определил ненаследование по тегу xml <inherited>false</inherited> в файле pom.xml дочернего модуля, похоже, он работает.

0 голосов
/ 07 ноября 2014

Вы можете отключить maven-assembly-plugin в фазе maven нет .

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.5</version>
  <executions>
    <execution>
      <phase>none</phase>
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>
0 голосов
/ 01 ноября 2011

Не уверен, что понимаю ситуацию.Но чтобы отключить выполнение плагина, попробуйте следующее:

        <!-- Don't run the reporting tool in submodule. -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions combine.self="override" combine.>
                <execution><id>reporting</id><phase>none</phase></execution>
            </executions>
        </plugin>

Вам нужно знать идентификатор выполнения от родителя и поместить его в этот фрагмент в ....

Вот хороший отчетобъяснение: http://www.sonatype.com/people/2011/01/maven-how-to-merging-plugin-configuration-in-complex-projects/

HTH

...