阅读 redhat 的文档(https://access.redhat.com/site/documentation/en-US/JBoss_Enterprise_Application_Platform/6/html/Development_Guide/chap-Class_Loading_and_Modules.html)我发现应用服务器类加载器 在加载用于避免任何冲突的类时有一个优先级列表 加载类,顺序如下
- 隐式依赖。 这些是 JBoss Enterprise Application Platform 6 自动添加的依赖项,例如 JAVA EE API。这些依赖项具有最高的类加载器优先级,因为它们包含 JBoss Enterprise Application Platform 6 提供的通用功能和 API。 有关每个隐式依赖项的完整详细信息,请参阅第 3.7.1 节“隐式模块依赖项”。
- 显式依赖。 这些是在应用程序配置中手动添加的依赖项。这可以使用应用程序的 MANIFEST.MF 文件或新的可选 JBoss 部署描述符 jboss-deployment-structure.xml 文件来完成。 请参阅第 3.2 节“向部署添加显式模块依赖项”以了解如何添加显式依赖项。
- 本地资源。 打包在部署本身内部的类文件,例如来自 WAR 文件的 WEB-INF/classes 或 WEB-INF/lib 目录。
- 部署间依赖性。 这些是对 EAR 部署中其他部署的依赖性。这可以包括 EAR 的 lib 目录中的类或其他 EJB jar 中定义的类。
我试图通过在我的 EAR 存档中使用 JSF webapp(rich faces)来测试这个订单 我的耳朵如下:
示例耳
--- sport.war
--- mysql.jar
--- 库
- 用例 1:我在 webapp (sport.war/WEB-INF/lib) 下添加了 JSF jar:[jsf-api-2.1. 14.jar/jsf-impl-2.1.14.jar/portletbridge-api-3.1.2.Final.jar/portletbridge-impl-3.1.2.Final.jar], jboss server 启动正常,我没有任何异常(exception)
- Usescase2:我在 sample.ear/lib 下添加了 JSF jar ==> 当我启动 jboss 服务器时出现异常(听起来应用程序服务器加载了 jboss Implicit dependencies 提供的模块 JSF 而不是我的 sample.ear/lib )
我不明白为什么在 1srt 用例 中 Class Loading Precedence 没有得到尊重,而在 2sd 用例 中 是否尊重类加载优先级?
请你澄清一下这一点
环境
- JBoss EAP 6.1.0.GA (AS 7.2.0.Final-redhat-8)
- JDK 6
最佳答案
如果没有看到您获得的确切部署异常,则很难诊断问题。
在第一种情况下,打包的库与您的应用程序加载到同一个类加载器中。
在第二种情况下,打包的库在单独的模块和类加载器中加载。
以上意味着,您遇到的部署问题不一定与类加载优先级相关,它们也可能与类加载隔离相关。
此外,Jboss 和 EAP 已经预打包了 JSF 的实现,您可能会因为版本不匹配而遇到冲突
如果您希望替换 JBoss 上的默认 JSF 实现,更好的选择是将新的 JSF 实现放在静态模块中,就像默认模块一样,并让 Jboss 按需加载它。
关于jsf - JBoss 部署中的类加载 as 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611394/