Uploaded image for project: 'Maven'
  1. Maven
  2. MNG-5694

Maven shade plugin transformers are not overrideable in child pom.

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Auto Closed
    • 2.2.1
    • None
    • Bootstrap & Build, POM
    • None
    • Windows 7, java 1.7.0_60, maven 2.2.1

    Description

      When you configure the maven-shade-plugin with a list of transformers in a root pom, but override the <transformers> section of the maven-shade-plugin in a child pom, the last defined transformer gets all of the parameters of the previous transformers in the list, potentially making mvn install/package unusable.

      Concrete case (see also attached zip example) : in the root pom.xml I put the following build configuration with a shade plugin and some transformers :

      <build>
      <plugins>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>1.5</version>
      <configuration>
      <outputFile>test-deploy.jar</outputFile>
      <transformers>
      <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
      <resource>META-INF/spring.handlers</resource>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
      <file>${project.build.directory}/generated-resources/versions/META-INF/${project.groupId}/${project.artifactId}.version</file>
      <resource>META-INF/assembly.version</resource>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
      <mainClass>${mainClass}</mainClass>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
      </transformers>
      </configuration>
      </plugin>
      </plugins>
      </build>

      if in a child pom.xml, I now put the exact same transformers (useless override, I know, but sometimes you need to add one in a sub project) :

      <build>
      <plugins>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <executions>
      <execution>
      <phase>package</phase>
      <goals>
      <goal>shade</goal>
      </goals>
      </execution>
      </executions>
      <configuration>
      <transformers>
      <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
      <resource>META-INF/spring.handlers</resource>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
      <file>${project.build.directory}/generated-resources/versions/META-INF/${project.groupId}/${project.artifactId}.version</file>
      <resource>META-INF/assembly.version</resource>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
      <mainClass>${mainClass}</mainClass>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
      </transformers>
      </configuration>
      </plugin>
      </plugins>
      </build>

      the 'mvn install' or 'mvn package' will fail with the following message :

      [ERROR] BUILD ERROR
      [INFO] ------------------------------------------------------------------------
      [INFO] Failed to configure plugin parameters for: org.apache.maven.plugins:maven-shade-plugin:1.5

      Cause: Cannot find setter nor field in org.apache.maven.plugins.shade.resource.ServicesResourceTransformer for 'resource'
      [INFO] ------------------------------------------------------------------------

      This is because if you check the effective pom with 'mvn help:effective-pom' you will see that the last transformer also gets the resource, file and mainClass parameters of the transformers defined above, while it's not supposed to:

      <transformers>
      <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
      <resource>META-INF/spring.handlers</resource>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
      <file>D:\dev\issue\child\target/generated-resources/versions/META-INF/mvn.transformers.issue.example/child.version</file>
      <resource>META-INF/assembly.version</resource>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
      <mainClass>${mainClass}</mainClass>
      </transformer>
      <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
      <resource>META-INF/spring.handlers</resource>
      <file>D:\dev\issue\child\target/generated-resources/versions/META-INF/mvn.transformers.issue.example/child.version</file>
      <mainClass>${mainClass}</mainClass>
      </transformer>
      </transformers>

      I put this issue in the POM/Bootstrap & Build category because it looks like a general xml 'aggregation' issue (title could maybe be generalized).

      Note: this is issue is not present with Maven 3.3.2! But if you do need to use 2.2.1 in your corporate environment, the only solution is to write a dummy transformer yourself that accepts the unwanted parameters to put at the end of the transformers list.

      Attachments

        1. issue.zip
          2 kB
          Kurt Verduyckt

        Activity

          People

            Unassigned Unassigned
            kurt.verduyckt Kurt Verduyckt
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: