Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Not A Problem
-
3.3.9
-
None
-
None
Description
Consider the project: https://github.com/stevenschlansker/maven-configure-transformer-bug/
Simple 2 module project. Parent defines some Shade plugin configuration, notably a ResourceTransformer with a mainClass declaration.
Child then tries to add a PropertiesMergingResourceTransformer, but somehow the mainClass declaration from the parent gets merged into this other transformer, causing a build failure:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.4.3:shade (assemble-app) on project maven-configure-transformer-bug-child: Unable to parse configuration of mojo org.apache.maven.plugins:maven-shade-plugin:2.4.3:shade for parameter mainClass: Cannot find 'mainClass' in class org.springframework.boot.maven.PropertiesMergingResourceTransformer -> [Help 1]
The effective POM shows that something extremely unintuitive is going on with model merging:
<plugin> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <id>assemble-app</id> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"> <resource>META-INF/spring.factories</resource> <mainClass>foo</mainClass> <collectSections>true</collectSections> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" /> </transformers> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.3.3.RELEASE</version> <scope>compile</scope> </dependency> </dependencies> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"> <resource>META-INF/spring.factories</resource> <mainClass>foo</mainClass> <collectSections>true</collectSections> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" /> </transformers> </configuration> </plugin>
It is possible to escape this by adding combine.self="override" to the <transformers> node. But I think the configuration ending up on the wrong transformer is a bug, and the fact that it causes duplicate configuration sections is also extremely confusing. And somewhere in the shuffle the original CollectingManifestResourceTransformer is lost entirely. (Note that it's not even on the plugin path, so referencing it should be an error!)
Attachments
Issue Links
- relates to
-
MNG-5922 Upgrade plexus-utils to 3.0.22 to support combine.id as configuration attribute for Map merging
-
- Closed
-