我的公司后端应用程序的war大小约为100 MB,因此我们决定将所有maven依赖项的范围更改为提供的。Jars从.war移动到opt/tomcat/shared/lib文件夹(根据本指令https://www.mulesoft.com/tcat/tomcat-classpath)。一切都很好,我们使用这个配置在这个服务器上部署了两个后端应用程序。在添加了第三个类似的后端应用程序之后,我们无法在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的工作文件夹。我们使用Java11 SpringBoot2、OpenJDK 11、Tomcat9.0.21。类DefaultTokenServices在spring-security-oauth2-2.3.5.RELEASE.jar中,我们将它与其他jars放在opt/tomcat/shared/lib文件夹中。
发布于 2020-05-12 13:40:51
我认为tomcat的SharedClassLoader (用于从tomcat的tomcat/shared/lib文件夹中加载jars )并不是线程安全的,因为当两个或多个线程试图并行定义同一个类时,就会出现这个LinkageError。
解决方案是向JVM添加AllowParallelDefineClass标志(tomcat/bin/catalina.sh)。这会导致当两个或多个线程试图并行定义同一个类时,而不是抛出错误,这两个线程都将返回第一个请求者的结果。
-XX:+AllowParallelDefineClass发布于 2020-05-11 18:21:53
这可能是由于相同jar文件的两个版本造成的。
https://stackoverflow.com/questions/60900156
复制相似问题