如何在WebSphere中管理ClassPath

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

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

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

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

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

戴夫

我假设在WebSphere中,您指的是常规J2EE应用服务器(而不是像Community Edition; WebSphere是应用于许多IBM产品的品牌名称)。

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

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

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

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

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

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

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

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 

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

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

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