java.lang.LinkageError на Tomcat9: java.net.URLClassLoader попытался дублировать определение класса для DefaultTokenServices

Размер бэкэнд-приложения моей компании составлял около 100 МБ, поэтому мы решили изменить объем всех зависимостей maven на предоставленные. Jar-файлы были перемещены из .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, который мы поместили в папку opt / tomcat / shared / lib вместе с другими банками.


person ForExample    schedule 28.03.2020    source источник


Ответы (2)


Я думаю, что Tomcat SharedClassLoader (который используется для загрузки jar-файлов из папки Tomcat tomcat / shared / lib) не является потокобезопасным, потому что эта ошибка LinkageError возникает, когда 2 или более потоков пытаются определить одно и то же занятие параллельно.

Решение состоит в том, чтобы добавить к JVM флаг AllowParallelDefineClass (tomcat / bin / catalina.sh). Это приводит к тому, что, когда 2 или более потока пытаются определить один и тот же класс параллельно, вместо выдачи ошибки оба из них будут возвращать результат первого запрашивающего.

-XX:+AllowParallelDefineClass
person ForExample    schedule 12.05.2020

Это может быть связано с двумя версиями одних и тех же файлов jar.

person syam kumar c    schedule 11.05.2020