Tried using the new -Djarmode=tools mode with Spring Boot 3.3.0 on my application and the extraction failed (stack trace below). It turns out to be because my application has a META-INF directory with a service configuration. If I remove my src/main/resources/META-INF directory and build the fat jar again, the extraction succeeds.
Repo: https://github.com/terraware/terraware-server
What I ran:
./gradlew bootJar
cd build/libs
java -Djarmode=tools -jar terraware-server-*.jar extract
Stack trace:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
Caused by: java.lang.IllegalStateException: java.io.UncheckedIOException: java.util.zip.ZipException: duplicate entry: META-INF/services/
at org.springframework.boot.jarmode.tools.ToolsJarMode.run(ToolsJarMode.java:56)
at org.springframework.boot.loader.launch.JarModeRunner.main(JarModeRunner.java:43)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 4 more
Caused by: java.io.UncheckedIOException: java.util.zip.ZipException: duplicate entry: META-INF/services/
at org.springframework.boot.jarmode.tools.ExtractCommand.run(ExtractCommand.java:118)
at org.springframework.boot.jarmode.tools.Command.run(Command.java:112)
at org.springframework.boot.jarmode.tools.Runner.runCommand(Runner.java:68)
at org.springframework.boot.jarmode.tools.Runner.run(Runner.java:55)
at org.springframework.boot.jarmode.tools.Runner.run(Runner.java:47)
at org.springframework.boot.jarmode.tools.ToolsJarMode.run(ToolsJarMode.java:53)
... 6 more
Caused by: java.util.zip.ZipException: duplicate entry: META-INF/services/
at java.base/java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:259)
at java.base/java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:115)
at org.springframework.boot.jarmode.tools.ExtractCommand.lambda$createApplication$3(ExtractCommand.java:258)
at org.springframework.boot.jarmode.tools.ExtractCommand.withJarEntries(ExtractCommand.java:333)
at org.springframework.boot.jarmode.tools.ExtractCommand.createApplication(ExtractCommand.java:254)
at org.springframework.boot.jarmode.tools.ExtractCommand.run(ExtractCommand.java:114)
... 11 more
Relevant contents of jarfile (unzip -l terraware-server-*.jar | grep META-INF):
0 05-29-2024 17:29 META-INF/
441 05-29-2024 17:29 META-INF/MANIFEST.MF
0 02-01-1980 00:00 META-INF/services/
66 02-01-1980 00:00 META-INF/services/java.nio.file.spi.FileSystemProvider
0 05-29-2024 17:29 BOOT-INF/classes/META-INF/
2884 05-29-2024 17:29 BOOT-INF/classes/META-INF/terraware-server.kotlin_module
0 05-29-2024 17:29 BOOT-INF/classes/META-INF/services/
70 05-29-2024 17:29 BOOT-INF/classes/META-INF/services/java.text.spi.DecimalFormatSymbolsProvider
0 05-29-2024 10:29 META-INF/BOOT.SF
Comment From: scottfrederick
Duplicates #40903. Can you try with the latest 3.3.1-SNAPSHOT build?
Comment From: sgrimm
Ah, thanks, overlooked that issue because I wasn't doing an AOT build. Can confirm that the problem is fixed in 3.3.1-SNAPSHOT.
Comment From: wilkinsona
I've updated the title of #40903 to reflect the broader nature of the problem.