-
Notifications
You must be signed in to change notification settings - Fork 41.7k
Description
- affected Spring Boot version:
3.3.3 - working Spring Boot version:
3.3.2
We traced the issue to the changes made by #41665 at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.JarUrlClassLoader.java (ClassLoader.registerAsParallelCapable();):
Wenn I build a bootJar with 3.3.3 and copy the JarUrlClassLoader.class file from a 3.3.2 bootJar, our application starts without the LinkageError!
I think there is something not sycronized or something like this in the JarUrlClassLoader so it's not capable for parallel execution.
But we have not yet identified the Problem in our application/dependencies, as this problem only occurs in one application out of several dozen applications. We are therefore unable to provide a reproducible demo application.
In the debuger i can see 2 calls in parallel:
- The first one is triggered by hibernate:
InstrumentationLoadTimeWeaver(spring) ->ClassFileTransformerAdapter(hibernate) ->EnhancingClassTransformerImpl(hibernate) - The second one is triggerd by springs orm
PersistenceAnnotationBeanPostProcessor
both entering LaunchedURLClassLoader.loadClass on main thread, then the first returns the loaded class, then the second fails with the LinkageError
Caused by: java.lang.IllegalStateException: Failed to introspect Class [...EmailServiceImpl] from ClassLoader [org.springframework.boot.loader.launch.LaunchedClassLoader@3941a79c]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:483)
at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:320)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:446)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:417)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findInjectionMetadata(PersistenceAnnotationBeanPostProcessor.java:376)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:353)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:1103)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:574)
... 75 common frames omitted
Caused by: java.lang.LinkageError: loader org.springframework.boot.loader.launch.LaunchedClassLoader @3941a79c attempted duplicate class definition for jakarta.mail.Message$RecipientType. (jakarta.mail.Message$RecipientType is in unnamed module of loader org.springframework.boot.loader.launch.LaunchedClassLoader @3941a79c, parent loader 'app')
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
at java.base/java.net.URLClassLoader.defineClass(Unknown Source)
at java.base/java.net.URLClassLoader$1.run(Unknown Source)
at java.base/java.net.URLClassLoader$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.net.URLClassLoader.findClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.loadClass(JarUrlClassLoader.java:107)
at org.springframework.boot.loader.launch.LaunchedClassLoader.loadClass(LaunchedClassLoader.java:91)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.base/java.lang.Class.getDeclaredMethods(Unknown Source)
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:465)
... 82 common frames omitted
The same issue with the classic classloader:
Caused by: java.lang.LinkageError: loader org.springframework.boot.loader.LaunchedURLClassLoader @b81eda8 attempted duplicate class definition for jakarta.mail.Message$RecipientType. (jakarta.mail.Message$RecipientType is in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @b81eda8, parent loader 'app')
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
at java.base/java.net.URLClassLoader.defineClass(Unknown Source)
at java.base/java.net.URLClassLoader$1.run(Unknown Source)
at java.base/java.net.URLClassLoader$1.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.net.URLClassLoader.findClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:150)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.base/java.lang.Class.getDeclaredMethods(Unknown Source)
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:465)
... 84 common frames omitted