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

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

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

慕容708150 2019-11-14 09:59:15
我在tomcat/webapps文件夹下有两个应用程序。tomcat/webapps/App1tomcat/webapps/App2两个应用程序共享相同的库。例如存储在中tomcat/webapps/App1/WEB-INF/lib。两个库是否都在内存中加载了两次?我应该把这些共享库放进去tomcat/server/lib吗?
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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


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


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

TA贡献1864条经验 获得超6个赞

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


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


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


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


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 615 浏览
慕课专栏
更多

添加回答

举报

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