我有两个应用程序在tomcat/webapps
文件夹下。Tomcat是否将两个相同的库文件加载到内存中,如果它们位于两个Web应用程序中?
tomcat/webapps/App1
tomcat/webapps/App2
两个应用程序共享相同的库。其中存储在例如tomcat/webapps/App1/WEB-INF/lib
中。
两个库都在内存中加载两次吗?
我应该把这些共享库放在tomcat/server/lib
吗?
我有两个应用程序在tomcat/webapps
文件夹下。Tomcat是否将两个相同的库文件加载到内存中,如果它们位于两个Web应用程序中?
tomcat/webapps/App1
tomcat/webapps/App2
两个应用程序共享相同的库。其中存储在例如tomcat/webapps/App1/WEB-INF/lib
中。
两个库都在内存中加载两次吗?
我应该把这些共享库放在tomcat/server/lib
吗?
正如你可以看到here下,Tomcat创建一个web应用程序每个服务器上的类加载器。 因此,如果你有共享同一个库的webapp1和webapp2,那么这个库确实会被加载两次。
,你都可以放在如果通过共享你的Tomcat服务器上运行的所有的webapps的公共目录(Tomcat的DIR/common/lib目录)这个库。
从以往的经验: - 一个库中的另一个不被利用 - 这两个网络的应用程序是完全相互隔离从而回答你最初的问题 - 是的,他们会被重复加载。
要回答你的第二个问题,你是否应该部署这些库到Tomcat的共享目录 - 我会说没有,这里的原因:
如果部署库JAR到共享位置(tomcat的/服务器/ lib目录),那么该库的该版本将成为在该Tomcat实例下运行的所有Web应用程序的默认值。从this overview of the tomcat architecture可以看出,类加载器在“链下”工作,单个Web应用程序的lib文件夹是引发类未发现异常之前最后看到的位置。这是不是在Tomcat的6和Tomcat 7真:在网络的任何类应用程式lib和classes文件夹将那些常见的前解决,因此,这不会破坏其部署所有的罐子在战争2其他应用。
因此部署一个共享库到该目录的问题是,它打破从一个-另一个被隔离为单独的应用程序的体系结构。在你最初的例子中很好,但是如果你想部署一个第三方应用程序(例如,如果你运行的是一个使用Portlet来处理特定内容的应用程序),你会立即遇到版本依赖问题 - 你的共享版本库对于第三方应用程序来说不是正确的,但是因为包已经被加载了,所以你会向左和向右引发异常。
然而,我认为它起作用了“链上”。另外链接是某种付费文档? – rogerdpack 2014-09-26 16:55:55
我不建议将jar文件放在共享文件夹中。比方说,您将来需要部署第三方应用程序,该应用程序在WEB-INF文件夹中具有较新版本的jar文件。对于这个应用程序,jar的类将被加载两次(即使它们具有相同的名称),一个来自共享文件夹,另一个来自web应用程序文件夹。这种情况可能会导致很难找到错误。
如果jar文件在Web应用程序文件夹,然后它们被单独的类加载器加载,不互相干扰。
我们正在使用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。
如果你不想让你的库加载两次把它们放在:
$CATALINA_HOME/lib
$CATALINA_HOME/common/lib
(从问题中移除,并在这里复制所以它可以被投票/评论)
堆堆空间是用来存放在Java中关于类的重新类和元数据。
错误java.lang.OutOfMemoryError:PermGen的空间可以经常因为我们加载大量重复库中的Apache Tomcat 可关于它的详细信息任何人共用
我没有内部服务器的公共目录时,我只是有类和lib目录。我应该创建一个共同的内部? – 2008-11-06 08:45:01
我编辑我的帖子,指出要使用的良好目录是[tomcat-installation-directory] / common/lib – romaintaz 2008-11-06 10:14:03
显然没关系[推荐]将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