У нас есть веб-приложение, которое мы запускаем в Tomcat 8, и недавно мы заметили, что артефакты (файлы .war), созданные некоторыми разработчиками в нашей команде, выдают NoClassDefFoundError
, тогда как тот же код, созданный другими функциямикак и ожидалось.
С logs/localhost.2018-05-11.log
:
org.jboss.resteasy.spi.UnhandledException: java.lang.NoClassDefFoundError: Could not initialize class org.geotools.referencing.datum.DefaultEllipsoid
...
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.geotools.referencing.datum.DefaultEllipsoid
at org.geotools.referencing.GeodeticCalculator.<init>(GeodeticCalculator.java:277)
...
Иногда, но не всегда, сопровождается (предшествует):
org.jboss.resteasy.spi.UnhandledException: java.lang.IncompatibleClassChangeError: Implementing class
...
Исследование войныфайлы, содержимое рабочих и поврежденных артефактов выглядит идентично, за одним заметным исключением «упорядочение каталогов» файлов jar в WEB-INF/lib
отличается.
Выполнение следующей процедуры над разобранным файлом warи перезапуск Tomcat, по-видимому, устраняет исключение:
$ # jars in "bad" order
$ ls -U WEB-INF/lib
x.jar
b.jar
y.jar
a.jar
c.jar
z.jar
$ cp -p WEB-INF/lib/* /tmp/lib/
$ rm -r WEB-INF/lib
$ mv /tmp/lib WEB-INF/lib
$ # jars in "good" order (appears to be alphabetical after a 'cp' on my system)
$ ls -U WEB-INF/lib
a.jar
b.jar
c.jar
x.jar
y.jar
z.jar
«Хорошие» войны не содержат банок в алфавитном порядке, но, похоже, существует ряд «хороших» порядков, а не «плохих»"orders.
Сначала я думал, что у нас может быть несколько версий класса DefaultEllipsoid
в разных банках, что приводит к состоянию гонки между правильной версией и другой версией, но tпохоже, это не тот случай.
Я включил подробную отладку загрузчика классов в tomcat, и в обоих случаях logs/catalina.out
показывает, что этот класс загружается из правильного jar:
[Loaded org.geotools.referencing.datum.DefaultEllipsoid from file: /opt/tomcat/temp/1-webapp/WEB-INF/lib/gt-referencing-11.4.jar]
Есть идеи о том, что здесь может происходить?
Подробности:
- CentOS 7
- Apache Tomcat / 8.0.43
- Java 1.8.0_144
- Apache Maven 3.3.9