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

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


tomcat/webapps/App1

tomcat/webapps/App2

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


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


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


慕容708150
浏览 622回答 3
3回答

凤凰求蛊

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

慕尼黑的夜晚无繁华

根据经验:这两个Web应用程序完全相互隔离-一个应用程序的库未在另一个应用程序中使用-因此可以回答您的第一个问题-是的,它们将被加载两次。为了回答第二个问题,是否应该将这些库部署到Tomcat的共享目录中-我会拒绝,这是为什么:如果将库Jar部署到共享位置(tomcat / server / lib),则该库版本将成为在该Tomcat实例下运行的所有Web应用程序的默认库。从tomcat架构的概述中可以看到,类加载器的工作是“顺着链条进行的”,其中单个Web应用程序的lib文件夹是它在抛出未找到类的异常之前将查找的最后一个位置。在Tomcat 6和Tomcat 7中并非如此:Web应用程序lib和classes文件夹中的任何类都将在共同使用之前被解析,因此,这不会破坏在战争2中部署所有jar的其他应用程序。因此,将共享库部署到该目录的问题是,它破坏了彼此隔离的单个应用程序的体系结构。在最初的示例中很好,但是如果您要部署第三方应用程序(例如,如果您正在运行使用Portlet来处理特定内容的应用程序),则会立即遇到版本依赖性问题-库的共享版本可能会对于第三方应用程序来说不是正确的,但是由于该软件包已经加载,因此您将在左右中间抛出异常。
打开App,查看更多内容
随时随地看视频慕课网APP