Managing multi-module dependencies with Maven assembly plugin

前端 未结 1 1583
自闭症患者
自闭症患者 2021-02-02 03:19

I use Maven assembly plugin to create an assembly for my multi-module project. There are two separate applications built from this multi-module project, each having a separate s

相关标签:
1条回答
  • 2021-02-02 03:36

    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.

    0 讨论(0)
提交回复
热议问题