2008-11-06 18 views

回答

37

正如你可以看到here下,Tomcat创建一个web应用程序每个服务器上的类加载器。 因此,如果你有共享同一个库的webapp1和webapp2,那么这个库确实会被加载两次。

,你都可以放在如果通过共享你的Tomcat服务器上运行的所有的webapps的公共目录(Tomcat的DIR/common/lib目录)这个库。

+1

我没有内部服务器的公共目录时,我只是有类和lib目录。我应该创建一个共同的内部? – 2008-11-06 08:45:01

+0

我编辑我的帖子,指出要使用的良好目录是[tomcat-installation-directory] ​​/ common/lib – romaintaz 2008-11-06 10:14:03

+0

显然没关系[推荐]将jdbc驱动程序部署到共享的FWIW中http://stackoverflow.com/questions/ 6981564/why-jdbc-driver-must-been-put-in-tomcat-home-lib-folder] – rogerdpack 2014-09-26 18:01:08

6

从以往的经验: - 一个库中的另一个不被利用 - 这两个网络的应用程序是完全相互隔离从而回答你最初的问题 - 是的,他们会被重复加载。

要回答你的第二个问题,你是否应该部署这些库到Tomcat的共享目录 - 我会说没有,这里的原因:

如果部署库JAR到共享位置(tomcat的/服务器/ lib目录),那么该库的该版本将成为在该Tomcat实例下运行的所有Web应用程序的默认值。从this overview of the tomcat architecture可以看出,类加载器在“链下”工作,单个Web应用程序的lib文件夹是引发类未发现异常之前最后看到的位置。这是不是在Tomcat的6和Tomcat 7真:在网络的任何类应用程式lib和classes文件夹那些常见的前解决,因此,这不会破坏其部署所有的罐子在战争2其他应用。

因此部署一个共享库到该目录的问题是,它打破从一个-另一个被隔离为单独的应用程序的体系结构。在你最初的例子中很好,但是如果你想部署一个第三方应用程序(例如,如果你运行的是一个使用Portlet来处理特定内容的应用程序),你会立即遇到版本依赖问题 - 你的共享版本库对于第三方应用程序来说不是正确的,但是因为包已经被加载了,所以你会向左和向右引发异常。

+0

然而,我认为它起作用了“链上”。另外链接是某种付费文档? – rogerdpack 2014-09-26 16:55:55

28

我不建议将jar文件放在共享文件夹中。比方说,您将来需要部署第三方应用程序,该应用程序在WEB-INF文件夹中具有较新版本的jar文件。对于这个应用程序,jar的类将被加载两次(即使它们具有相同的名称),一个来自共享文件夹,另一个来自web应用程序文件夹。这种情况可能会导致很难找到错误。

如果jar文件在Web应用程序文件夹,然后它们被单独的类加载器加载,不互相干扰。

5

我们正在使用tomcat6并找到一个很好的方法,让tomcat塞满了我们所有web应用程序需要的通用库。

编辑在的conf /卡塔利娜。物业条目common.loader。例如。追加与罐子您想分享“mylibs”

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar, 
       ${catalina.home}/lib,${catalina.home}/lib/*.jar, 
       {catalina.home}/mylibs/*.jar 

然后把所有的公共库有一个额外的文件夹。完成。

为什么我们开始在所有webapps(WAR文件)中使用mylibs文件夹而不是WEB-INF/lib?

战争越过50MB线后,部署开始变成一场噩梦!

具有永不罐子版web应用程序时,你仍然可以把它放进WEB-INF/lib目录覆盖你在mylibs

1

如果你不想让你的库加载两次把它们放在:

  • 的Tomcat 6:$CATALINA_HOME/lib
  • 的Tomcat 5:$CATALINA_HOME/common/lib

(从问题中移除,并在这里复制所以它可以被投票/评论)

0

堆堆空间是用来存放在Java中关于类的重新类和元数据。

错误java.lang.OutOfMemoryError:PermGen的空间可以经常因为我们加载大量重复库中的Apache Tomcat 可关于它的详细信息任何人共用

相关问题