Tomcat9上的java.lang.LinkageError:java.net.URLClassLoader尝试为De



我公司后端应用程序的war大小约为100MB,因此我们决定更改所有maven依赖项的范围。Jars已从.war移到opt/tomcat/shared/lib文件夹(根据此说明https://www.mulesoft.com/tcat/tomcat-classpath)。一切都很好,我们使用此配置在此服务器上部署了2个后端应用程序。在我们添加了第三个类似的后端应用程序后,我们无法使用登录oauth2服务,因为在日志中我们可以看到以下错误:

org.springframework.cglib.core.CodeGenerationException: java.lang.LinkageError-->loader java.net.URLClassLoader @2f943d71 (instance of java.net.URLClassLoader, child of java.net.URLClassLoader @bd8db5a java.net.URLClassLoader) attempted duplicate class definition for org.springframework.security.oauth2.provider.token.DefaultTokenServices$$FastClassBySpringCGLIB$$5a1f25c.

前两款应用程序仍然可以正常工作,但第三款则不然。每次部署之前,我们都会清除tomcat的工作文件夹。我们使用Java 11 SpringBoot2、OpenJDK 11、Tomcat 9.0.21。类DefaultTokenServices位于spring-security-oauth2-2.3.5.RELEASE.jar中,我们将其与其他jar一起放在opt/tomcat/shared/lib文件夹中。

我认为Tomcat的SharedClassLoader(用于从Tomcat的Tomcat/shared/lib文件夹加载jar(不是线程安全的,因为当两个或多个线程试图并行定义同一个类时,似乎会发生此LinkageError。

解决方案是将AllowParallelDefineClass标志添加到JVM(tomcat/bin/catalina.sh(。这会导致当两个或多个线程试图并行定义同一个类时,两个线程都将返回第一个请求者的结果,而不是抛出错误。

-XX:+AllowParallelDefineClass

这可能是由于同一jar文件的两个版本造成的。

最新更新