为了账号安全,请及时绑定邮箱和手机立即绑定

如果Tomcat在两个Web应用程序中,它们是否两次将同一库文件加载到内存中?

/ 猿问

如果Tomcat在两个Web应用程序中,它们是否两次将同一库文件加载到内存中?

慕容708150 2019-11-14 09:59:15

我在tomcat/webapps文件夹下有两个应用程序。


tomcat/webapps/App1

tomcat/webapps/App2

两个应用程序共享相同的库。例如存储在中tomcat/webapps/App1/WEB-INF/lib。


两个库是否都在内存中加载了两次?


我应该把这些共享库放进去tomcat/server/lib吗?


查看完整描述

3 回答

?
守着一只汪

如您在这里看到的,Tomcat在您的服务器上为每个webapp创建一个类加载器。因此,如果您的webapp1和webapp2共享同一个库,则该库实际上将加载两次。


如果该库由Tomcat服务器上运行的所有 Web应用程序共享,则最终可以将其放在公共目录(tomcat-dir / common / lib)中。


查看完整回答
反对 回复 2019-11-14
?
凤凰求蛊

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


如果jar文件位于Web应用程序文件夹中,则它们由单独的类加载器加载,并且不会互相干扰。


查看完整回答
反对 回复 2019-11-14
?
慕尼黑的夜晚无繁华

根据经验:这两个Web应用程序完全相互隔离-一个应用程序的库未在另一个应用程序中使用-因此可以回答您的第一个问题-是的,它们将被加载两次。


为了回答第二个问题,是否应该将这些库部署到Tomcat的共享目录中-我会拒绝,这是为什么:


如果将库Jar部署到共享位置(tomcat / server / lib),则该库版本将成为在该Tomcat实例下运行的所有Web应用程序的默认库。从tomcat架构的概述中可以看到,类加载器的工作是“顺着链条进行的”,其中单个Web应用程序的lib文件夹是它在抛出未找到类的异常之前将查找的最后一个位置。在Tomcat 6和Tomcat 7中并非如此:Web应用程序lib和classes文件夹中的任何类都将在共同使用之前被解析,因此,这不会破坏在战争2中部署所有jar的其他应用程序。


因此,将共享库部署到该目录的问题是,它破坏了彼此隔离的单个应用程序的体系结构。在最初的示例中很好,但是如果您要部署第三方应用程序(例如,如果您正在运行使用Portlet来处理特定内容的应用程序),则会立即遇到版本依赖性问题-库的共享版本可能会对于第三方应用程序来说不是正确的,但是由于该软件包已经加载,因此您将在左右中间抛出异常。


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信