Closed ghevge closed 10 months ago
Did you read the very first paragraph of the upgrade guide? https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.2-Release-Notes
@knoobie thanks for pointing me to that doc! I am using spring-boot-maven-plugin not maven-compiler-plugin. Do you know how can I set the "parameters" configuration on spring-boot-maven-plugin ?
I've already tried to add the spring-boot-starter-parent as described here but that causes a java.lang.StackOverflowError error during startup:
Caused by: java.lang.reflect.InvocationTargetException
middleware_1 | ... 1024 more
middleware_1 | Caused by: java.lang.reflect.InvocationTargetException
middleware_1 | ... 1024 more
middleware_1 | Caused by: java.lang.StackOverflowError
middleware_1 | at java.base/sun.nio.fs.UnixPath.<init>(UnixPath.java:76)
middleware_1 | at java.base/sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:312)
middleware_1 | at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1445)
middleware_1 | at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:724)
middleware_1 | at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:251)
middleware_1 | at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:180)
middleware_1 | at java.base/java.util.jar.JarFile.<init>(JarFile.java:345)
middleware_1 | at java.base/java.util.jar.JarFile.<init>(JarFile.java:316)
middleware_1 | at java.base/java.util.jar.JarFile.<init>(JarFile.java:282)
middleware_1 | at org.springframework.boot.loader.jar.NestedJarFile.<init>(NestedJarFile.java:135)
middleware_1 | at org.springframework.boot.loader.jar.NestedJarFile.<init>(NestedJarFile.java:120)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.UrlNestedJarFile.<init>(UrlNestedJarFile.java:42)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.UrlJarFileFactory.createJarFileForNested(UrlJarFileFactory.java:86)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.UrlJarFileFactory.createJarFile(UrlJarFileFactory.java:55)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.UrlJarFiles.getOrCreate(UrlJarFiles.java:72)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.JarUrlConnection.connect(JarUrlConnection.java:289)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.JarUrlConnection.getJarFile(JarUrlConnection.java:99)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.getJarFile(JarUrlClassLoader.java:185)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.definePackage(JarUrlClassLoader.java:143)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.definePackageIfNecessary(JarUrlClassLoader.java:126)
middleware_1 | at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.loadClass(JarUrlClassLoader.java:99)
middleware_1 | at org.springframework.boot.loader.launch.LaunchedClassLoader.loadClass(LaunchedClassLoader.java:91)
middleware_1 | at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
middleware_1 | at java.base/java.lang.Class.forName0(Native Method)
middleware_1 | at java.base/java.lang.Class.forName(Class.java:534)
middleware_1 | at java.base/java.lang.Class.forName(Class.java:513)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:88)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
middleware_1 | at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
middleware_1 | at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
middleware_1 | at java.base/java.lang.reflect.Method.invoke(Method.java:580)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
middleware_1 | at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
middleware_1 | at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
middleware_1 | at java.base/java.lang.reflect.Method.invoke(Method.java:580)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
middleware_1 | at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
middleware_1 | at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
middleware_1 | at java.base/java.lang.reflect.Method.invoke(Method.java:580)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91)
middleware_1 | at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53)
middleware_1 | at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58)
middleware_1 | at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
@ghevge Please see the Spring Framework wiki for an example of how to configure the parameters compiler argument.
The java.lang.StackOverflowError
looks like a misconfiguration with the JarLauncher
being configured to launch itself. Do you have any customization in your pom for the application's main class or start class?
@wilkinsona thanks for your reply! I've already checked that page. As I've mentioned above, I am using spring-boot-maven-plugin, so what is mentioned in the wiki page, doesn't work for my case. Apparently what I have to do to enable that flag for this plugin, is to inherit the spring-boot-starter-parent pom (as I've also mentioned above). But that is causing the StackOverflowError.
In my pom I have no customizations in regards to the application's main class and/or start class. I've already added a snippet of my pom above showing the plugin section.
The resulting jar is an executable jar, which is started using this command line:
exec java -jar $JAVA_EXTRA_OPTS -Dspring.config.additional-location=optional:file:$CONFIG_OVERRIDE_DIR -Dspring.profiles.active=$JAVA_SPRING_PROFILES $APP_JAR
where: $CONFIG_OVERRIDE_DIR="path to config dir" $APP_JAR="middleware-exec.jar" $JAVA_SPRING_PROFILES="myprofile" JAVA_EXTRA_OPTS= "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5555 -Dlogging.config=classpath:/log4j2-plaintext.xml -XX:MaxRAMPercentage=95 -XX:+ExitOnOutOfMemoryError"
Unless you're using AOT (which you haven't mentioned), Spring Boot's Maven plugin isn't responsible for performing any compilation. Compilation with parameters needs to be configured on Maven's compiler plugin. Unfortunately, in complete snippets from your pom aren't sufficient for us to be able to help you. If you would like us to spend some more time investigating, please spend some time providing a complete yet minimal sample that reproduces the problem. You can share it with us by pushing it to a separate repository on GitHub or by zipping it up and attaching it to this issue.
@wilkinsona finally found my problem!
So it seems that if you copy and paste blindly the pom snippet from the wiki page you provided, the resulting jar will exhibit the behavior I've initially mentioned.
If I add a version tag to that snippet, the resulting build works as it used to work with older spring-boot versions.
I think the wiki page must be updated so that others won't fall into the same pitfall as I did...
Thanks for your support! I will close this issue once I will get your opinion on the wiki update.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
Support for <parameters>
was added in 3.6.2 of the compiler plugin in 2017. I'll leave it up to the Framework team to decide if they think it's worth updating their wiki to mention this (cc @snicoll). As there's nothing for us to do on the Boot side, I'm going to close this one.
If I add a version tag to that snippet, the resulting build works as it used to work with older spring-boot versions.
So it looks like your project has pinned a very old maven compiler plugin version. Trying to paste the snippet and looking down such an old version leads to the following for me:
[WARNING] Parameter 'parameters' is unknown for plugin 'maven-compiler-plugin:3.6.1:compile (default-compile)'
We can't hardcode a version in the release notes because that doesn't look like a good idea to give the impression that a particular version is required. In reality any version more recent that 3.6.2
would work. Given it's 6+ years old, that looks like a safe assumption to me.
@snicoll at least you can put a version placeholder, if you don't want to provide a version value. to make other aware. It will be a big time saver. I would have saved a couple of hours of digging into the problem, if the version tag would have been there in the first place.
After upgrading my code from Java 17 and Spring-boot 3.1.3 to Java 21 and String-boot 3.2.0, I've started to see errors like the ones below, when calling the REST APIs:
After running some more tests, using different spring-boot versions with Java 21, I can tell that the problem is only visible with spring-boot 3.2.0. The system works fine if I use spring-boot 3.1.6 with Java 21.
Any idea what is going on? Is there a new spring-boot glitch as it seem to have had occurred in the past? https://github.com/spring-projects/spring-loaded/issues/68
Thanks
My maven compile plugin configuration: