总结我遇到的问题,我有一个使用库的版本A的EJB(我们称之为dep-vA.jar)。 dep-vA.jar打包在EJB的jar文件的根目录中。应用程序服务器中的域lib文件夹包含同一库的版本B(我们称之为dep-vB.jar)。调用EJB时,由于加载dep-vB.jar文件而不是dep-vA.jar,我收到错误。
我想这个问题的第一部分是,Sun One Application Server v9.1是否将EJB相互隔离?我觉得它确实如此。但似乎另一个应用程序加载了dep-vB.jar,而这个EJB直接使用它而不加载它自己的。
第二个问题是,如果app服务器确实隔离了EJB,它是否在查看应用程序服务器的lib文件夹之前从EJB的jar文件加载依赖项?我的印象是这也是事实,但也许不是......
是否有人熟悉Sun应用程序服务器来解释为什么要加载dep-vB.jar而不是dep-vA.jar?有没有办法让它加载dep-vA.jar而不改变应用程序服务器的lib文件夹中的内容? (我会毫不犹豫地做任何可能影响服务器上其他应用程序的事情)
感谢。
答案 0 :(得分:1)
我想这个问题的第一部分是,Sun One Application Server v9.1是否将EJB相互隔离?我觉得它确实如此。但似乎另一个应用程序加载了dep-vB.jar,而这个EJB直接使用它而不加载它自己的。
根据Sahoo(GlassFish开发人员), Java EE规范不要求类在单个模块的模块之间加载隔离,因此行为可能不同从一个应用服务器到另一个。使用Sun ONE,我对documentation的理解是EJB-JAR是孤立的。
第二个问题是,如果app服务器确实隔离了EJB,它是否在查看应用程序服务器的lib文件夹之前从EJB的jar文件加载依赖项?我的印象是这也是事实,但也许不是......
这是父母优先策略(据我所知,Sun ONE允许更改仅适用于webapps的委派模式)。
话虽如此,如果在EJB-JAR的dep-vA.jar
的{{1}}条目中列出Class-Path
会发生什么?
答案 1 :(得分:0)
我没有使用过那个特定的服务器,但我知道在WebSphere中,有一个选项可以使用PARENT_FIRST或PARENT_LAST类加载。您将寻找PARENT_LAST的等效项,其中在上升到服务器之前首先从EAR加载类。
我认为在任何应用服务器中都可以进行这样的配置,因为您应始终能够强制执行特定于应用程序的jar,以便加载到任何其他应用服务器上。