Home > Back-end >  tests fat jar with maven shade-plugin
tests fat jar with maven shade-plugin

Time:04-11

I need to build one jar for execution tests during CI process on server. This jar have to contains all test dependencies (like junit, mockito) and spring boot dependencies while my test will use spring. I wrote such maven configuration:

        <plugin>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <id>shade</id>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <finalName>${project.artifactId}-fat</finalName>
                        <minimizeJar>false</minimizeJar>
                        <shadeTestJar>false</shadeTestJar>
                        <artifactSet>
                            <includes>
                                <include>*:*</include>
                            </includes>
                        </artifactSet>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>pl.klolo.demo.demo.smoke.SmokeTestAppKt</mainClass>
                                <manifestEntries>
                                    <Multi-Release>true</Multi-Release>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Maven built one jar with all dependencies, but when I try to execute test I have strange error which I cannot understand:

2022-04-08 20:45:44.611  INFO 591618 --- [           main] p.k.d.demo.tests.DemoApplicationTests    : No active profile set, falling back to 1 default profile: "default"
2022-04-08 20:45:45.018 ERROR 591618 --- [           main] o.s.boot.SpringApplication               : Application run failed
java.lang.IllegalStateException: Unable to read meta-data for class 
    at org.springframework.boot.autoconfigure.AutoConfigurationSorter$AutoConfigurationClass.getAnnotationMetadata(AutoConfigurationSorter.java:237) ~[demo-fat.jar:0.0.1]
    at org.springframework.boot.autoconfigure.AutoConfigurationSorter$AutoConfigurationClass.getOrder(AutoConfigurationSorter.java:208) ~[demo-fat.jar:0.0.1]
    at org.springframework.boot.autoconfigure.AutoConfigurationSorter$AutoConfigurationClass.access$000(AutoConfigurationSorter.java:154) ~[demo-fat.jar:0.0.1]
    at org.springframework.boot.autoconfigure.AutoConfigurationSorter.lambda$getInPriorityOrder$0(AutoConfigurationSorter.java:64) ~[demo-fat.jar:0.0.1]
    at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[na:na]
    at java.base/java.util.TimSort.sort(TimSort.java:220) ~[na:na]
    at java.base/java.util.Arrays.sort(Arrays.java:1515) ~[na:na]
    at java.base/java.util.ArrayList.sort(ArrayList.java:1750) ~[na:na]
    at org.springframework.boot.autoconfigure.AutoConfigurationSorter.getInPriorityOrder(AutoConfigurationSorter.java:62) ~[demo-fat.jar:0.0.1]

Could you tell me what is wrong and how to fix it?

SmokeTestApp:

fun main(args: Array<String>) {
    val launcher = LauncherFactory.create()
    val listener = SummaryGeneratingListener()
    launcher.registerTestExecutionListeners(listener)
    launcher.execute(
       LauncherDiscoveryRequestBuilder.request()
          .selectors(selectPackage("pl.klolo"))
          .build()
    )

    printSummary(listener.summary)
    exitProcess(
        if (listener.summary.failures.isEmpty()) 0
        else -1
    )
}

fun printSummary(summary: TestExecutionSummary) {
    println("Passed tests:  ${summary.testsSucceededCount}")

    summary.failures.forEach {
        println("###FAILED TEST ${it.testIdentifier.uniqueId}###")
        it.exception.printStackTrace()
    }
}

DemoApplicationTests:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class DemoApplicationTests(
    @Value("\${test.applicationURI}") val applicationURI: String,
    @Value("\${test.applicationPort}") val applicationPort: Int
) {

init {
    RestAssured.baseURI = applicationURI
    RestAssured.port = applicationPort
}

@Tag("smoke_test")
@Test
fun contextLoads() {
    println("smoke test ===> 1")
}

CodePudding user response:

I found reason of my problem. It was file spring.factories with entry:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=

When I removed file jar works correctly

  • Related