Java 如果多个web应用程序需要一个jar文件?

Java 如果多个web应用程序需要一个jar文件?,java,jakarta-ee,web-applications,Java,Jakarta Ee,Web Applications,如果多个web应用程序需要一个jar文件,那么您会选择哪个选项?将其保存在服务器类路径中,或者为每个web应用程序的lib文件夹保留一份jar文件副本?如果应用程序服务器(如Java EE库)中尚未包含该库,我建议为每个web应用程序保留一份副本,并且不要为此更改服务器类路径 我将使您更容易管理web应用程序及其版本的依赖关系。如果您的大多数web应用程序都使用相同的库,那么您很可能需要将其保留在服务器类路径中。由独立(新)类加载器加载的每个web应用程序—因此在运行时,此类类加载器将从库中加载

如果多个web应用程序需要一个jar文件,那么您会选择哪个选项?将其保存在服务器类路径中,或者为每个web应用程序的lib文件夹保留一份jar文件副本?

如果应用程序服务器(如Java EE库)中尚未包含该库,我建议为每个web应用程序保留一份副本,并且不要为此更改服务器类路径


我将使您更容易管理web应用程序及其版本的依赖关系。

如果您的大多数web应用程序都使用相同的库,那么您很可能需要将其保留在服务器类路径中。由独立(新)类加载器加载的每个web应用程序—因此在运行时,此类类加载器将从库中加载和定义类,并存储在perm gen中。这可能会导致不必要的内存分配。唯一的解决方法是在服务器上注册库,并且(不一定是因为类加载器会跟随)包war排除该库

但若只有很少的,那个么将它保存在WEB-INF下的lib中。若依赖的应用程序将被取消部署以释放资源,那个么库类仍将被加载并且无用

ApacheTomcat类加载器参考:

从技术上讲,这取决于JAR文件的类型,通常只有一个选项

如果它是基于Java EE的“web片段”JAR文件,可以通过具有
/META-INF/web片段.xml
文件和/或
/META-INF/faces config.xml
和/或
/META-INF/*.tld
文件和/或包含web内容文件(JSP/CSS/JS/etc)的
/META-INF/resources
文件夹来识别,那么它肯定属于战争的
/WEB-INF/lib
。否则,注释/注册的web片段工件(模块化servlet、过滤器、侦听器、标记、组件、bean等)将不会自动扫描、发现和安装,和/或web片段资源(共享JSP/Facelets/CSS/JS/image文件)不能包含在webapp中

或者,如果它表示一个JavaEEAPI的实现,比如JSF、JSTL、JAX-RS等,那么它可以(应该)进入服务器的
/lib
,但是您必须确保替换任何现有的/旧的实现,否则您可能会遇到由于运行时类路径中重复的不同版本库而导致的类加载问题(可通过类/方法/字段相关的异常识别,例如
NoSuchMethodError
LinkageError
,等等)。如果仍将其包含在WAR中,则需要确保指示相关服务器或API使用WAR捆绑实现,而不是服务器捆绑实现

否则很可能是“纯香草”基于Java SE的库,如Apache Commons和friends。这样的库可以安全地放在服务器的
/lib
中,并在所有Web应用程序之间共享。这至少是JDBC驱动程序和smiliar JAR所必需的,这些JAR在JVM启动期间自动将内容加载到内存中,可以通过针对J基于ava SE的API。否则,当这样一个库被放置在webapp的
/WEB-INF/lib
中时,在热部署过程中可能会发生内存泄漏风险,因为它不能发出Java EE取消部署的信号,并且在JVM未关闭时盲目地再次自动加载内容

另见:

谢谢你简洁的解释。