首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.LinkageError on Tomcat9: java.net.URLClassLoader尝试为DefaultTokenServices定义重复类

java.lang.LinkageError on Tomcat9: java.net.URLClassLoader尝试为DefaultTokenServices定义重复类
EN

Stack Overflow用户
提问于 2020-03-28 10:50:33
回答 2查看 394关注 0票数 0

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

代码语言:javascript
复制
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文件夹中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-12 13:40:51

我认为tomcat的SharedClassLoader (用于从tomcat的tomcat/shared/lib文件夹中加载jars )并不是线程安全的,因为当两个或多个线程试图并行定义同一个类时,就会出现这个LinkageError。

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

代码语言:javascript
复制
-XX:+AllowParallelDefineClass
票数 1
EN

Stack Overflow用户

发布于 2020-05-11 18:21:53

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60900156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档