Frage

Ich verwende MAVEN-Baugruppen-Plugin, um eine Baugruppe für mein Multi-Module-Projekt zu erstellen. Es gibt zwei separate Anwendungen, die aus diesem Multi-Modul-Projekt aufgebaut sind, wobei jeweils ein separates Satz von Abhängigkeiten verfügt. Ich habe einen benutzerdefinierten Montage-Deskriptor gemacht, der zwei Verzeichnisse (für jede Anwendung) mit Modulaufbauten und deren jeweiligen Abhängigkeiten zusammensetzt. Es macht alles gut, aber eine Sache - es setzt Abhängigkeiten für beide Module an die Montage des anderen.

Das Folgende ist eine vereinfachte Version meines Projekts, die genau das gleiche Verhalten hat.

Betrachten Sie ein Projekt, das aus zwei Modulen und einem Montagemodul besteht: generasacodicetagpre.

Ich habe Abhängigkeiten nur zur Demonstration hinzugefügt: generasacodicetagpre.

Hier ist der Elternteil Pom: generasacodicetagpre.

module1 pom: generasacodicetagpre.

module2 pom: generasacodicetagpre.

Montage POM: generasacodicetagpre.

und schließlich der Montagekriptor: generasacodicetagpre.

Wie Sie sehen, ist die Montage an die Paketphase binden. Also, wenn ich mich ausführt generasacodicetagpre.

Aus dem übergeordneten Verzeichnis habe ich die folgende Montage generasacodicetagpre.

Grundsätzlich ist das Problem hier, dass Modul1 nicht von Commons-Daemon abhängt, der Montage-Plugin hat jedoch die Abhängigkeit enthalten. Ähnlich, mit Modul2 und Commons-CLI.

Kann jemand erklären, warum sich das Montage-Plugin auf diese Weise verhält?

ein was wäre eine Lösung?

War es hilfreich?

Lösung

I've always had similar experiences using the assembly plugin with multi-module projects where the end result wasn't what I expected. I hope someone else can provide a more accurate answer as to why that's happening and how best to use those two concepts in tandem.

That said, a possible work-around would be to have module1 and module2 generate their own assembly artifacts which contain their respective jars and dependencies. Then you can modify the assembly sub-module pom file to have dependencies on the generated distribution artifacts from its sibling modules and then unpack those into a new assembly.

In both Module1 and Module2's pom files you can add an assembly plugin configuration to your package phase much like you did with the assembly sub-module.

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2.2</version>

        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>

        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/descriptor.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
    </plugins>
  </build>

Module1 would have a src/main/assembly/descriptor.xml like this

<assembly>
  <id>distribution</id>
  <includeBaseDirectory>false</includeBaseDirectory>

  <formats>
    <format>zip</format>
  </formats>

  <dependencySets>
    <dependencySet>
      <outputDirectory>module1</outputDirectory>
      <unpack>false</unpack>
    </dependencySet>
  </dependencySets>
</assembly>

And Module2 will have a similar src/main/assembly/descriptor.xml

<assembly>
  <id>distribution</id>
  <includeBaseDirectory>false</includeBaseDirectory>

  <formats>
    <format>zip</format>
  </formats>

  <dependencySets>
    <dependencySet>
      <outputDirectory>module2</outputDirectory>
      <unpack>false</unpack>
    </dependencySet>
  </dependencySets>
</assembly>

Then in the assembly/pom.xml you would add the Module 1 and 2 zip artifacts as dependencies

  <dependencies>
    <dependency>
      <groupId>com.test.app</groupId>
      <artifactId>module1</artifactId>
      <version>1.0</version>
      <type>zip</type>
      <classifier>distribution</classifier>
    </dependency>
    <dependency>
      <groupId>com.test.app</groupId>
      <artifactId>module2</artifactId>
      <version>1.0</version>
      <type>zip</type>
      <classifier>distribution</classifier>
    </dependency>
  </dependencies>

...and trim up the assembly/src/main/assembly/descriptor.xml file to look like this

<assembly>
  <id>distribution</id>
  <includeBaseDirectory>false</includeBaseDirectory>

  <formats>
    <format>dir</format>
  </formats>

  <dependencySets>
    <dependencySet>
      <useTransitiveDependencies>false</useTransitiveDependencies>
      <unpack>true</unpack>
    </dependencySet>
  </dependencySets>

</assembly>

Like I said this would be one possible work around and unfortunately adds a significant amount of additional XML configuration to your build process. But it works.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top