close
The Wayback Machine - https://web.archive.org/web/20260211010336/https://github.com/spring-projects/spring-framework/issues/25940
Skip to content

Improve diagnostics for CGLIB ClassLoader issues with shared classes in parent ClassLoader #25940

@iherasymenko

Description

@iherasymenko

Reproducible on JDK 11, 15 (presumably 9+) and the latest Spring Framework (5.2.9).

I put together a simple reproducer, which mimics the Tomcat setup where this issue can be observed.

The deployment configuration is as follows.

-- lib
     - spring libraries
     - shared lib
-- webapp1
     - Configuration1.class that references a class with @Transactional annotation from the shared lib
-- webapp2
     - Configuration2.class that references a class with @Transactional annotation from the shared lib
  • If the JVM is run with --illegal-access=deny and BOTH apps are deployed, the second app fails with the error.
  • If the JVM is run with --illegal-access=deny and just ONE app is deployed, everything works fine.
  • If the JVM is run with --illegal-access=warn (or simply without this argument) and either one app or both apps are deployed, everything works fine.
  • If the JVM is run without specifying --illegal-access, but the libraries are placed on the module path, the second app fails with the error.

The reproducer is here. Run gradlew runWithIllegalAccessDeny, gradlew runWithIllegalAccessWarn, and gradlew runOnModulePath accordingly.

The error:

java.lang.LinkageError-->loader 'app' attempted duplicate class definition for com.example.SimpleService$$EnhancerBySpringCGLIB$$df04dc18. (com.example.SimpleService$$EnhancerBySpringCGLIB$$df04dc18 is in unnamed module of loader 'app')

	at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:558)
	at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363)
	at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585)
	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:110)
	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:108)
	at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)
	at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)
	at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:134)
	at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319)
	at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572)
	at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:419)
	at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57)
	at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:205)
	... 17 more

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: backportedAn issue that has been backported to maintenance branchestype: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions