【问题标题】:Tomcat 7 How ClassLoader loads from 2 webapps, same package/classes hierarchy, different classes?Tomcat 7 ClassLoader 如何从 2 个 webapps、相同的包/类层次结构、不同的类加载?
【发布时间】:2014-06-04 09:08:42
【问题描述】:

我有这种情况:

  1. //Tomcat7/webapps/app1/WEB-INF/classes/a/b/c/A.class
  2. //Tomcat7/webapps/app1/WEB-INF/classes/a/b/c/B.class
  3. //Tomcat7/webapps/app2/WEB-INF/classes/a/b/c/B.class(与类不同但同名)
  4. //Tomcat7/webapps/app2/WEB-INF/classes/a/b/c/C.class

注意:类目录层次相同,只是类文件不同。

app1 的日志文件包含 NoClassDefFoundError for A.class。检查目录,类文件肯定在那里。现在我想弄清楚 ClassLoader 是否有可能只加载 B.class 而不是 A.class,尽管每个 webapps 应该有一个 ClassLoader - 意味着两个 ClassLoader?

有什么想法吗?

编辑:Tomcat7 是通过 Tanuki JWS 启动的。从wrapper.log可以看到先初始化app2,然后才初始化app1。

问候, 艾伦

【问题讨论】:

  • 如果我没记错的话,Tomcat 会分别管理每个应用程序的类路径,因此来自 app1 的类不能被来自 app2 的同名类隐藏。
  • 如果使用 Tanuki JSW 启动容器,这个也会一样吗?
  • 你似乎真的一心要责备你正在使用的工具。我会停止这种做法,除非你至少有一些证据证明它可能是真的,希望它成为你个人做错的事情,这样你就可以修复它,这对你更有好处。我举个例子:你检查了是否有文件 A.class.好的。你检查它是否大于0字节?
  • 我没有责怪正在使用的工具。我试图了解环境以及它们是否相互影响以及如何影响。这就是为什么我在这里问是否有人以前遇到过。如果我有证据我早就贴出来了。是的,它大于 0 字节。如果看到类没有损坏或其他什么,现在尝试反编译该类。

标签: java tomcat7 classloader tanuki


【解决方案1】:

Tomcat7 重启后,此问题已解决。无法确定根本原因。

【讨论】:

  • 也许 webapp 被重新加载了,这可能会导致问题,尤其是当有静态类成员在运行时。
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多