2

We have hosted our web applications on Tomcat 6.0.18 and experienced the following problem:

There are two web apps WebApp1 and WebApp2, both are same system but of different versions.

Now the problem is when the tomcat has been running for a week or longer time then sometimes system gives NoClassDefFoundError ! also we got some strange issue where the Class Loader of WebApp1 has loaded the class present in the jar of WebApp2 ! The same jar is also present in WebApp1 but the versions are different.

When we restarted the Tomcat everything started working fine ! Our JRE is 1.5.10

Please let me know if you have encountered such issues.

Regards, Jatan Porecha

4

4 回答 4

1

我在 Tomcat 中遇到过很多非常多的类加载器怪异——即使您自己不执行任何类加载器代码,Tomcat 本身也很容易产生问题。最常见的问题似乎是反复卸载和重新加载 web 应用程序会泄漏类加载器并最终导致 Tomcat 内存不足。

我看到的版本不匹配的最常见原因是 Tomcat 确保某些类和 jars(Tomcat 本身的一部分)在您的 webapp 类路径中领先于任何其他类——commons-logging 似乎是最常见的例子——而且有可能用于在您不期望的时候加载、卸载或保留类加载器。

您能否提供更多详细信息 - 如果 jar 来自第三方,则很有可能有人以前见过这个问题。如果它是您自己的 jar,那么您在应用程序中是否有任何您自己的类加载器代码?

于 2008-11-25T17:54:45.330 回答
1

我仍然没有足够的代表来添加评论,所以我将不得不发布另一个答案。:)

这听起来像是 MailSender.class 以某种方式加载到 Tomcat 中,而不是加载到每个单独的 web 应用程序中。WebApp2 首先加载它并且它可以工作,即使它被加载到所有不是 WebApp2 私有的 Tomcat 中。当 WebApp1 需要该类时,它已经看到它已加载到 Tomcat 父级中,并且不会尝试将一个私有加载到 WebApp1。

我首先建议您检查您的 Tomcat、JRE 等目录,以查看这些路径中是否存在 jar 或类的副本。之后,我将手动从两个 jar 文件中删除该类并重新启动 Tomcat 或 Web 应用程序以查看会发生什么 - 您会期望它失败并产生堆栈跟踪,这将告诉您您的类首次加载的位置谁在尝试加载它。(例如,从类名来看,您可能有一个邮件 API,已加载到 Tomcat JVM 中,该 API 将类加载到 Tomcat 中,而不是您的 web 应用程序中)。

于 2008-11-25T19:17:46.613 回答
1

您在同一台服务器上托管 2 个完全相同的代码版本是否有特殊原因?

拥有 2 个具有完全相同名称的不同 jar,在相同的命名空间中包含类,并且具有相同的类名似乎会导致各种问题(其中最重要的是人为错误)。

于 2008-11-25T19:23:24.073 回答
0

感谢克里斯的回复。

jar 已成为系统的一部分,并具有一些由其他进程共享的公共类。

让我们调用那个 jar comutils.jar 所以场景是这样的,

WebApp1(版本 1)
  |
  |- comutils.jar (ver 1)
        |
        |- MailSender.class (ver 1)


WebApp2(版本 2)
  |
  |- comutils.jar (ver 2)
        |
        |- MailSender.class (ver 2)

这个 MailSender 类是单例的。

现在有时发生的情况是,每当 WebApp1 的代码在使用 getInstance 方法检索其实例后调用 MailSender 的任何方法时,实际调用都会转到 MailSender(版本 2)而不是版本 1!

希望这会给你一些线索。

于 2008-11-25T18:42:56.777 回答