关于wls:prefer-web-inf-classes与外部依赖库的类加载疑问
关于
wls:prefer-web-inf-classes的类加载优先级疑问 我已经查阅了大量关于wls:prefer-web-inf-classes的文章,但仍对其工作机制存在疑问。我的应用依赖结构如下:
- my-app.war --- | - libs.war < ---
问题:若将wls:prefer-web-inf-classes设为true,WebLogic类加载器会优先加载my-app.war的库而非libs.war中的类,对吗?
官方文档说明
默认情况下,该元素值为False。设为True时会反转类加载器委托模型,让Web应用的类定义优先于更高层级类加载器加载的类。这允许Web应用使用自身版本的第三方类,这些类也可能属于WebLogic Server。详情请参阅weblogic.xml部署描述符元素。
若将该元素设为true,会使Web应用WEB-INF目录中的类优先于应用类加载器或系统类加载器加载的类。默认值为false。控制台指定的值优先级高于手动配置的值。
问题解答
答案不能一概而论,核心取决于libs.war的类加载器层级:
- 如果
libs.war是作为应用级共享库部署(比如放在EAR的lib目录,或是WebLogic全局共享库),它的类加载器属于my-app.war的父类加载器层级。此时开启wls:prefer-web-inf-classes="true",my-app.war的WEB-INF/classes和WEB-INF/lib中的类会优先于libs.war的类加载,符合你假设的情况。 - 如果
libs.war是嵌套在my-app.war的WEB-INF/lib目录中,那么my-app.war的类加载器本来就会优先加载自身WEB-INF下的资源,该配置不会改变这一默认逻辑。 - 如果
libs.war是与my-app.war同级部署的独立Web应用,my-app.war通过跨应用方式依赖它,此时两者的类加载器是同级关系,wls:prefer-web-inf-classes仅影响my-app.war与上层类加载器(如WebLogic系统类加载器)的优先级,不直接决定它和libs.war之间的类加载顺序。
内容的提问来源于stack exchange,提问作者Jose A. Matarán
相关产品推荐
相关产品推荐

