7

我在 Websphere v6.1 中的 Web 模块类路径有问题。

在我的 WEB-INF/lib 中,我有大量的 jar 文件,其中包括 xercesImpl.jar 和 xmlparserv2.jar。我需要两个罐子都在场,但它们似乎相互冲突。具体来说,每个 jar 包含一个 META-INF/services 目录,因此,当我们尝试通过 JAXP 获取 DocumentBuilderFactory 的实例时,我们获得的实例取决于这两个 jar 在类路径中出现的顺序。

一直想使用 DocumentBuildFactory 的 xerces 实例,所以我想将 xercesImpl.jar 推到类路径的前面。我尝试通过在 Manifest 文件中为 war 文件指定一个 Class-Path 部分来做到这一点,但是我在 WAS Module Compound CLass Loader 中实际获得的类路径非常奇怪。我似乎得到了 WAS 放置的一些标准内容,然后是按字母顺序排列的 WEB-INF lib 的内容,然后是 Manifest 文件指定的类路径。

如果我根本不将清单文件放入战争中,我会得到标准的东西,然后是 WEB-INF/lib 的内容,但顺序是任意的。

我错过了什么?有没有办法可以将类路径设置为我想要的?

戴夫

4

4 回答 4

4

我假设 WebSphere 是指常规的 J2EE Application Server(而不是类似于 Community Edition 的东西;WebSphere 是应用于许多 IBM 产品的品牌名称)。

我认为你的选择是有限的。由于依赖关系看起来非常明确,我更喜欢编程方法而不是依赖于类路径的变幻莫测(比如显式创建工厂实例而不是依赖于 SPI)。

如果这不是一个选项,您可能希望查看使您的依赖项之一成为 EAR 项目实用程序 JAR 并使用 WAR 上的 PARENT_LAST 类加载策略配置 MODULE 类加载。这可以通过浏览器管理控制台进行配置(或者通过RAD工具,如果您使用它)。

我要看的另一件事是 WAS共享库功能(在浏览器管理控制台的环境下)。这些可以与服务器应用程序相关联。缺点是这需要更多的配置。

于 2009-01-09T18:37:48.617 回答
4

在 IBM Websphere Application Server 6.1 中,Web 模块有自己的类加载器,通常在 PARENT_FIRST 模式下使用。这意味着 Web 模块类加载器会在加载任何新类之前尝试将类加载委托给父类加载器。

如果您希望在 XML 解析器 v2(我假设是 Oracle XML v2 解析器)类之前加载 Xerces 类,则必须由父类加载器加载 Xerces 类 - 在这种情况下,最好是应用程序类加载器. 这可以通过将 Xerces jar 放在 EAR 文件的根目录中(如果有的话)或使用 xerces.jar 准备 EAR 文件并将 WAR 文件放在根目录中来完成。然后应该将 xmlparserv2 jar 放在 WEB-INF\lib 中。

您还可以尝试创建一个 Xerces 共享库以供您的应用程序使用。

您可以在IBM WebSphere Application Server V6.1:系统管理和配置中找到有关此的更多信息。详细信息可在第 12 章中找到。

于 2009-01-09T19:05:36.813 回答
1

JAXP 如何选择解析器

您可能想知道这个程序实际使用的是哪个解析器。毕竟,JAXP 是相当独立于解析器的。答案取决于您的类路径中安装了哪些解析器以及某些系统属性是如何设置的。默认是使用由javax.xml.parsers.DocumentBuilderFactory系统属性命名的类。例如,如果您想确保使用 Xerces 来解析文档,那么您可以像这样运行 JAXPChecker:

D:\books\XMLJAVA>java -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl  JAXPChecker file:///D:/books/xmljava/dom.xml
> file:///D:/books/xmljava/dom.xml is well-formed.

如果javax.xml.parsers.DocumentBuilderFactory未设置该属性,那么 JAXP 会在 JRE 目录中的 lib/jaxp.properties 属性文件中查找系统属性的默认值javax.xml.parsers.DocumentBuilderFactory。例如,如果您想始终如一地使用某个 DOM 解析器,gnu.xml.dom.JAXPFactory请将以下行放在该文件中:

javax.xml.parsers.DocumentBuilderFactory=gnu.xml.dom.JAXPFactory

如果找不到解析器,接下来 JAXPMETA-INF/services/javax.xml.parsers.DocumentBuilderFactory会在运行时可用的所有 JAR 文件中查找一个文件,以找到具体DocumentBuilderFactory子类的名称。

最后,如果失败,则DocumentBuilderFactory.newInstance()返回一个默认类,通常是来自还提供 JAXP 类的供应商的解析器。例如,org.apache.crimson.jaxp.DocumentBuilderFactoryImpl默认选择 JDK JAXP 类,但选择 Ælfred JAXP 类gnu.xml.dom.JAXPFactory

于 2010-03-01T17:03:29.743 回答
0

您还可以尝试设置系统属性以更喜欢实现。例如,更喜欢 xmlparserv2 dom 解析器,设置 javax.xml.parsers.DocumentBuilderFactory=oracle.xml.jaxp.JXDocumentBuilderFactory

于 2009-11-10T10:00:36.380 回答