Tomcat 6将跨Webappscaching吗?

我有一个Ubuntu 12.04服务器上的Tomcat 6服务器与4GB和以下JAVA_OPTS

JAVA_OPTS =“ – Djava.awt.headless = true -Xms512M -Xmx512M -XX:PermSize = 1024M -XX:MaxPermSize = 1024M -XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled”

愚蠢的问题:如果我部署相同的Web应用程序(相同的战争文件)几次(每个引用不同的Postgres数据库) – 作为server.com:8080/webapp1 server.com:8080/webapp2等…

我可以假设Tomcat会在多个webapps上caching类文件吗? 或者 – 每个Web应用程序Tomcatcaching类?

在此先感谢丹尼

答案取决于你的web应用使用的类文件的位置。

如果将给定的类放在$ CATALINA_HOME / lib的Tomcat Common类加载器path中,则它将可用于所有的webapps。 其cachingforms也是如此。

如果使用webapps / webapp / WEB-INF / classes和webapps / webapp / WEB-INF / lib的Tomcat Web应用程序类加载器path,则应用程序之间会隔离类和相应的类caching。

技术背景

Tomcat不符合Java本身处理类的方式,而是使用定制的Java类加载器。这是为了执行一些与以下相关的function:

  • 在一个Web应用程序中的类处理
  • 每个webapp的类caching
  • 在webapplication启动/运行时预加载和重新加载类
  • 在课堂加载/参考安全

Tomcat自定义类加载器使用Java默认的Bootstrap,Extension和System类加载器,但将System类加载器使用的classpathvariablesreplace为自己的类path。 这具有以下效果:

  • 用Tomcats自己replaceJava附带的认可标准覆盖机制。
  • 在Java类加载层次结尾添加两个额外的类加载器:

    • Tomcat通用类加载器
    • 每个webapp都有一个单独的类加载器

原来的类path被Tomcat忽略。

关键的细节是,webapp类加载器不会首先将类加载委托给父类,但会尝试按请求加载每个类。 每个加载的类随后都被有问题的webapp类加载器caching。 这个类加载器/caching级别不能在webapps之间共享。

通用类加载器加载的所有类都可以公开提供给所有的web应用程序,包括caching。 不鼓励在通用类加载器path中广泛放置类:

  • 打破可移植性
  • Tomcat和不同的webapps可能会有不同的版本要求。
  • 维修成了一个问题,哪个class属于哪个?

类加载/caching/重装过程中有相当多的精细打印。 如果这很重要,我的build议是阅读专业Apache Tomcat 6中有关类加载的杰出章节。

压缩版本是由本页面上的某人撰写的。