如果多个Web应用程序需要jar文件,那么您将选择哪个选项?是将其保存在服务器类路径中还是为每个Web应用程序的lib文件夹保留jar文件的一个副本?
从技术上讲,这取决于它是哪种JAR文件,通常只有一个选择。
如果它是基于Java EE的“ Web片段” JAR文件,可以通过包含一个/META-INF/web-fragment.xml
文件和/或一个/META-INF/faces-config.xml
和/或一个/META-INF/*.tld
文件和/或/META-INF/resources
包含Web内容文件(JSP / CSS / JS / etc)的文件夹来识别,则它绝对属于WAR的/WEB-INF/lib
。否则,将不会自动扫描,发现和安装带注释/注册的Web片段工件(模块化Servlet,过滤器,侦听器,标签,组件,Bean等)和/或Web片段资源(共享的JSP / Facelets / CSS / JS /图片文件)不能包含在webapp中。
或者,如果它表示Java EE API的实现,例如JSF,JSTL,JAX-RS等,则可以(应该)放入服务器的/lib
,但是必须确保替换任何现有/较旧的实现,否则你可能会碰到的类加载引起的运行时类路径复制不同的版本库(由类/方法/领域相关的异常,如识别故障NoSuchMethodError
,LinkageError
等等)。如果仍然将其包含在WAR中,则需要确保指示服务器或相关API使用WAR捆绑的实现,而不是服务器捆绑的实现。
否则,它很可能是基于“普通香草”的Java SE库,例如Apache Commons和friends。这样的库可以安全地进入服务器的库,/lib
并在所有Web应用程序之间共享。至少对于具有服务加载器的JDBC驱动程序和辅助JAR,这是必需的,该服务加载器可在JVM启动期间将内容自动加载到内存中,并可以通过/META-INF/services
基于Java SE的API的文件夹来识别。否则,将此类库放置在webapp的库中时,可能会在热部署期间发生内存泄漏风险/WEB-INF/lib
,因为它无法表示Java EE已取消部署,并且不会在JVM尚未关闭时又盲目地自动加载内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句