Skip to content

LinkageError: loader org.springframework.boot.loader.launch.LaunchedClassLoader @3941a79c attempted duplicate class definition for jakarta.mail.Message$RecipientType #42087

@xtermi2

Description

@xtermi2
  • 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    for: external-projectFor an external project and not something we can fixstatus: invalidAn issue that we don't feel is valid

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions