Chr*_*ley 7 java tomcat maven tomcat8 centos7
我们有一个我们在Tomcat 8中运行的Web应用程序,最近我们观察到我们团队中的一些开发人员构建的工件(.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)
...
Run Code Online (Sandbox Code Playgroud)
这有时(但不总是)伴随(前面):
org.jboss.resteasy.spi.UnhandledException: java.lang.IncompatibleClassChangeError: Implementing class
...
Run Code Online (Sandbox Code Playgroud)
检查war文件,工作和损坏的工件的内容看起来是相同的,有一个值得注意的例外,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
Run Code Online (Sandbox Code Playgroud)
"好"的战争没有按字母顺序排列的罐子,但似乎有许多"好"的订单有很多"坏"的订单.
我最初认为我们可能DefaultEllipsoid在不同的jar中有多个版本的类,导致正确的版本和另一个版本之间的竞争条件,但似乎并非如此.
我在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]
Run Code Online (Sandbox Code Playgroud)
知道这里可能会发生什么吗?
细节:
该行:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.geotools.referencing.datum.DefaultEllipsoid
Run Code Online (Sandbox Code Playgroud)
意味着该类DefaultEllipsoid已找到但有效,还有其他一些类需要加载但失败。另一个类无效。
正是这个类可能被复制为两个截然不同的版本,或者一个版本用于编译,另一个版本在运行时具有不同的方法签名。
另外,从 tomcat8 开始,应用程序 jar 文件WEB-INF/lib不再按照字母顺序加载。我认为 tomcat 网站上有一个包含此内容的文档,但现在我找不到它了,但我在tomcat bugzilla bug 57129上发现了一个回归错误(不会修复)
这个类加载器意味着,如果您更改了 Tomcat 上的某些内容WEB-INF/lib并重新启动 Tomcat,那么如果存在重复的 jar 版本,则会出现一些随机类加载,使您的应用程序以一种方式加载。
总结一下:检查DefaultEllipsoid导入并检查这些类是否有重复。您的构建还需要清理以使用与运行时相同的版本(我希望您使用类似的工具maven来进行构建)
| 归档时间: |
|
| 查看次数: |
415 次 |
| 最近记录: |