Dragos Roban
Dragos Roban

Reputation: 599

Maven shade plugin fails on updating Spring Boot version to 2.4.0 from 2.3.3

I just updated the Spring Boot version in my project from 2.3.3 to 2.4.0.

For a module in my project I use maven-shade-plugin with a simple shade goal, no configuration. When I was using Spring Boot 2.3.3 everything went well. With this update to 2.4.0 seems like it asks me for an configuration which I cannot load.

I did this required configs from this post But it didn't help me.

Here is what I have now.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <dependencies>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>2.4.0</version>
    </dependency>
    </dependencies>
    <executions>
        <!-- Run shade goal on package phase -->
        <execution>
            <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>
                    </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"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

I don't have a main class because this module behaves like a client (swagger generated stuff).

The error when I build with maven is the following:

Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:3.2.1:shade (default) on project zenzefi-client: Unable to parse configuration of mojo org.apache.maven.plugins:maven-shade-plugin:3.2.1:shade for parameter transformers: Cannot load implementation hint 'org.springframework.boot.maven.PropertiesMergingResourceTransformer'

What am I missing?

Parent pom

<?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.0</version>
            <!-- updated 08.2020 -->
        </parent>
    
        <groupId>com.proj.myproject</groupId>
        <artifactId>common-parent</artifactId>
        <packaging>pom</packaging>
        <version>1.89.0.0-SNAPSHOT</version>
        <description>Parent POM</description>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    
            <!-- Dependencies versions -->
            <jacoco.version>0.8.5</jacoco.version>
            <commons-cli.version>1.4</commons-cli.version>
            <commons-io.version>2.6</commons-io.version>
            <commons-lang3.version>3.9</commons-lang3.version>
            <bouncycastle.version>1.66</bouncycastle.version>
            <flyway-core.version>5.2.4</flyway-core.version>
            <secunet.version>1.4.0</secunet.version>
            <jaxb.version>2.3.1</jaxb.version>
            <javax.annotation.version>1.3.2</javax.annotation.version>
            <org.hibernate.version>5.3.15.Final</org.hibernate.version>
            <commons-lang.version>2.6</commons-lang.version>
            <forms.version>1.0.7</forms.version>
    
            <!-- Swagger -->
            <springfox-swagger.version>2.9.2</springfox-swagger.version>
            <swagger-core.version>1.5.24</swagger-core.version>
    
            <jodatime.version>2.10.5</jodatime.version>
            <okhttp.version>2.7.5</okhttp.version>
            <gson.version>2.8.6</gson.version>
    
            <!-- Plugins versions -->
            <maven-assembly-plugin.version>3.2.0</maven-assembly-plugin.version>
            <maven-eclipse-plugin.version>2.10</maven-eclipse-plugin.version>
            <maven-jarsigner-plugin.version>3.0.0</maven-jarsigner-plugin.version>
            <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version>
            <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
            <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
            <licence-maven-plugin.version>2.0.0</licence-maven-plugin.version>
            <swagger-codegen-maven-plugin.version>2.2.3</swagger-codegen-maven-plugin.version>
            <jacoco-maven-plugin.version>0.8.5</jacoco-maven-plugin.version>
            <janino-version>3.1.0</janino-version>
            <launch4j-maven-plugin.version>1.7.25</launch4j-maven-plugin.version>
            <maven-shade-plugin.version>3.2.1</maven-shade-plugin.version>
            <gmaven-plugin.version>1.0</gmaven-plugin.version>
            <soapui-maven-plugin.version>5.2.1</soapui-maven-plugin.version>
            <process-exec-maven-plugin>0.9</process-exec-maven-plugin>
    
            <timestamp>${maven.build.timestamp}</timestamp>
            <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
            <sonar.jacoco.reportPath>${project.basedir}/../target/</sonar.jacoco.reportPath>
    
            <!-- Test dependencies -->
            <wiremock-standalone.version>2.18.0</wiremock-standalone.version>
            <threadweaver.version>0.1</threadweaver.version>
            <junit.version>4.13.1</junit.version>
            <junit.vintage.version>5.7.0</junit.vintage.version>
            <mockito-all.version>1.9.5</mockito-all.version>
            <zip4j.version>2.6.4</zip4j.version>
    
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>javax.annotation</groupId>
                    <artifactId>javax.annotation-api</artifactId>
                    <version>${javax.annotation.version}</version>
                </dependency>
                <dependency>
                    <groupId>io.springfox</groupId>
                    <artifactId>springfox-swagger2</artifactId>
                    <version>${springfox-swagger.version}</version>
                </dependency>
                <dependency>
                    <groupId>io.springfox</groupId>
                    <artifactId>springfox-swagger-ui</artifactId>
                    <version>${springfox-swagger.version}</version>
                </dependency>
                <dependency>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-annotations</artifactId>
                    <version>${swagger-core.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.squareup.okhttp</groupId>
                    <artifactId>okhttp</artifactId>
                    <version>${okhttp.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.squareup.okhttp</groupId>
                    <artifactId>logging-interceptor</artifactId>
                    <version>${okhttp.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.google.code.gson</groupId>
                    <artifactId>gson</artifactId>
                    <version>${gson.version}</version>
                </dependency>
                <dependency>
                    <groupId>joda-time</groupId>
                    <artifactId>joda-time</artifactId>
                    <version>${jodatime.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.bouncycastle</groupId>
                    <artifactId>bcprov-jdk15on</artifactId>
                    <version>${bouncycastle.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.bouncycastle</groupId>
                    <artifactId>bcpkix-jdk15on</artifactId>
                    <version>${bouncycastle.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.bouncycastle</groupId>
                    <artifactId>bctls-jdk15on</artifactId>
                    <version>${bouncycastle.version}</version>
                </dependency>
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>${commons-io.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                    <version>${commons-lang3.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.secunet</groupId>
                    <artifactId>ed25519ph-common</artifactId>
                    <version>${secunet.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.secunet</groupId>
                    <artifactId>ed25519phlib</artifactId>
                    <version>${secunet.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.secunet</groupId>
                    <artifactId>ed25519ph-pkcs12support</artifactId>
                    <version>${secunet.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.flywaydb</groupId>
                    <artifactId>flyway-core</artifactId>
                    <version>${flyway-core.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>${maven-dependency-plugin.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.codehaus.janino</groupId>
                    <artifactId>janino</artifactId>
                    <version>${janino.version}</version>
                </dependency>
                <!-- OAuth -->
                <dependency>
                    <groupId>org.springframework.security.oauth.boot</groupId>
                    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
                    <version>2.1.0.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                    <version>${junit.vintage.version}</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                    <scope>test</scope>
                </dependency>
                <!-- Test -->
                <dependency>
                    <groupId>com.github.tomakehurst</groupId>
                    <artifactId>wiremock-standalone</artifactId>
                    <version>${wiremock-standalone.version}</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.mockito</groupId>
                    <artifactId>mockito-all</artifactId>
                    <version>${mockito-all.version}</version>
                    <scope>test</scope>
                </dependency>
                <!-- Needed for Java 10 -->
                <dependency>
                    <groupId>javax.xml.bind</groupId>
                    <artifactId>jaxb-api</artifactId>
                    <version>${jaxb.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.glassfish.jaxb</groupId>
                    <artifactId>jaxb-runtime</artifactId>
                    <version>${jaxb.version}</version>
                </dependency>
                <dependency>
                    <groupId>javax.annotation</groupId>
                    <artifactId>javax.annotation-api</artifactId>
                    <version>${javax.annotation.version}</version>
                </dependency>
                <!-- Needed for Java 11 -->
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>${org.hibernate.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-entitymanager</artifactId>
                    <version>${org.hibernate.version}</version>
                </dependency>
                <!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j -->
                <dependency>
                    <groupId>net.lingala.zip4j</groupId>
                    <artifactId>zip4j</artifactId>
                    <version>${zip4j.version}</version>
                </dependency>
    
                <dependency>
                    <groupId>com.googlecode.thread-weaver</groupId>
                    <artifactId>threadweaver</artifactId>
                    <version>${threadweaver.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
    
        </dependencyManagement>
    
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>${maven-assembly-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-eclipse-plugin</artifactId>
                        <version>${maven-eclipse-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-jarsigner-plugin</artifactId>
                        <version>${maven-jarsigner-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>${maven-resources-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-shade-plugin</artifactId>
                        <version>${maven-shade-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>${maven-surefire-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>license-maven-plugin</artifactId>
                        <version>${licence-maven-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>io.swagger</groupId>
                        <artifactId>swagger-codegen-maven-plugin</artifactId>
                        <version>${swagger-codegen-maven-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>com.akathist.maven.plugins.launch4j</groupId>
                        <artifactId>launch4j-maven-plugin</artifactId>
                        <version>${launch4j-maven-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <configuration>
                            <!-- The value X makes javadoc ignoring the tag -->
                            <tags>
                                <tag>
                                    <name>description</name>
                                    <placement>X</placement>
                                </tag>
                                <tag>
                                    <name>solution</name>
                                    <placement>X</placement>
                                </tag>
                            </tags>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>${jacoco-maven-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>org.codehaus.groovy.maven</groupId>
                        <artifactId>gmaven-plugin</artifactId>
                        <version>${gmaven-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>com.smartbear.soapui</groupId>
                        <artifactId>soapui-maven-plugin</artifactId>
                        <version>${soapui-maven-plugin.version}</version>
                    </plugin>
                    <plugin>
                        <groupId>com.bazaarvoice.maven.plugins</groupId>
                        <artifactId>process-exec-maven-plugin</artifactId>
                        <version>${process-exec-maven-plugin}</version>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
        <profiles>
            <profile>
                <id>merge</id>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.jacoco</groupId>
                            <artifactId>jacoco-maven-plugin</artifactId>
                            <executions>
                                <execution>
                                    <id>merge-results</id>
                                    <phase>verify</phase>
                                    <goals>
                                        <goal>merge</goal>
                                    </goals>
                                    <configuration>
                                        <fileSets>
                                            <fileSet>
                                                <directory>${project.basedir}/../target</directory>
                                                <includes>
                                                    <include>*.exec</include>
                                                </includes>
                                                <exclude>jacoco_merged.exec</exclude>
                                            </fileSet>
                                        </fileSets>
                                        <destFile>${project.basedir}/../target/jacoco_merged.exec/</destFile>
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
            </profile>
            <profile>
                <id>jacoco</id>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.jacoco</groupId>
                            <artifactId>jacoco-maven-plugin</artifactId>
                            <executions>
                                <execution>
                                    <id>prepare-agent</id>
                                    <goals>
                                        <goal>prepare-agent</goal>
                                    </goals>
                                    <configuration>
                                        <excludes>
                                            <exclude>src/main/ui/**/*.js</exclude>
                                            <exclude>src/main/ui/**/*.ts</exclude>
                                            <exclude>src/main/ui/**/*.tsx</exclude>
                                        </excludes>
                                        <!-- Sets the path to the file which contains the execution data. -->
                                        <destFile>${sonar.jacoco.reportPath}jacoco_${project.artifactId}.exec</destFile>
                                        <!-- Sets the name of the property containing the settings for JaCoCo
                                            runtime agent. -->
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-surefire-plugin</artifactId>
                            <configuration>
                                <!-- Jacoco prepare-agent builds some command-line params without -->
                                <!-- which jacoco will not instrument. Hence it is important to add -->
                                <!-- those command-line params here (${argLine} holds those params) -->
                                <argLine>${argLine} -Xms128m -Xmx512m</argLine>
                                <forkCount>1</forkCount>
                                <runOrder>random</runOrder>
                                <testFailureIgnore>true</testFailureIgnore>
                            </configuration>
                        </plugin>
                    </plugins>
                </build>
                <reporting>
                    <plugins>
                        <plugin>
                            <groupId>org.jacoco</groupId>
                            <artifactId>jacoco-maven-plugin</artifactId>
                            <reportSets>
                                <reportSet>
                                    <reports>
                                        <report>report</report>
                                    </reports>
                                </reportSet>
                            </reportSets>
                        </plugin>
                    </plugins>
                </reporting>
            </profile>
            <profile>
                <id>packageSources</id>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-dependency-plugin</artifactId>
                            <version>3.0.1</version>
                            <executions>
                                <execution>
                                    <id>src-dependencies</id>
                                    <phase>package</phase>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                    <configuration>
                                        <classifier>sources</classifier>
                                        <failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
                                        <outputDirectory>${project.build.directory}/sources</outputDirectory>
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
            </profile>
    
            <profile>
                <id>jdk-11-compile</id>
                <activation>
                    <jdk>11</jdk>
                </activation>
                <properties>
                    <maven.compiler.source>11</maven.compiler.source>
                    <maven.compiler.target>11</maven.compiler.target>
                    <maven.compiler.release>8</maven.compiler.release>
                </properties>
            </profile>
            <profile>
                <id>jdk-8-compile</id>
                <activation>
                    <jdk>[,8]</jdk>
                </activation>
                <properties>
                    <maven.compiler.source>1.8</maven.compiler.source>
                    <maven.compiler.target>1.8</maven.compiler.target>
                </properties>
            </profile>
        </profiles>
    </project>

Upvotes: 5

Views: 4539

Answers (1)

MrGurkentomate
MrGurkentomate

Reputation: 171

I had the same issue with spring-boot version 2.4.5 and maven-shade-plugin 3.2.0, upgrading maven-shade-plugin to 3.2.4 fixed the issue for me.

Upvotes: 16

Related Questions