如何在WebSphere中管理ClassPath

时间:2009-01-09 12:04:08

标签: java websphere

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

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

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

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

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

戴夫

4 个答案:

答案 0 :(得分:4)

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

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

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

我要看的另一件事是WAS Shared Libraries功能(在浏览器管理控制台的 Environment 下)。这些可以是associated with serversapplications。缺点是需要更多配置。

答案 1 :(得分:4)

在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: System Management and Configuration中找到有关此内容的更多信息。详情见第12章。

答案 2 :(得分: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

如果找不到解析器,则下一个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

答案 3 :(得分:0)

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