技术开发 频道

如何解决Websphere中wsjar的问题

IT168 技术文档】

    概述

    我们知道,Websphere有自己的Classloader,它对类的加载做了一些自己的定制,但是往往由于有些定制的特殊性,而造成了人们在上面部署应用的不方面,这其中一个比较大麻烦就是,Webpshere中对jar包中资源的定位URL有自己特殊的格式,例如:

wsjar:file:/C:/dev/ws/default/sample_app/xsd.resources.jar!/org/eclipse/test.xml

    我们知道URL是统一资源定位描述,Sun J2SE标准中,jar包中的资源的URL格式应该是以jar:开头,即类似如下的样子

jar:file:/C:/dev/ws/default/sample_app/xsd.resources.jar!/org/eclipse

    而目前大多数开源技术,在以URL做为参数来载入实际资源时,并没有考虑到wsjar开头的情况,因此当一个较为复杂的应用向Webpshere服务器部署时,往往就会出现关于这方面的报错,例如:

No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath:
wsjar:file:/F:/WebSphere/AppServer/lib/workplaceoa/ehcache-1.1.jar!/ehcache-failsafe.xml

    如果你仍然觉得不知道在什么情况下会出现wsjar的情况,那么给你举一个例子:下面我们使用apache commons中的commons configuration来写一个代码片断

Configuration configuration = (Configuration) confMap.get(name); if (configuration == null) { ConfigurationFactory factory = new ConfigurationFactory(); URL url = PropertyGetter.class.getClassLoader().getResource("myconfig.xml");//你将myconfig.xml打在某个jar包中 factory.setConfigurationURL(url); try { configuration = factory.getConfiguration(); } catch (Exception e) { logger.error("could not find the configuration ", e); } } String value=configuration.getString(propertyName);

    将该代码片断放在websphere某个应用的某个jsp文件中,执行该页面时就会报如下的错误:

[06-4-18 14:31:03:500 CST] 73068638 Digester E org.apache.commons.digester.Digester Begin event threw exception
[06-4-18 14:31:03:516 CST] 73068638 Digester E org.apache.commons.digester.Digester TRAS0014I: 下列异常已记录
org.apache.commons.configuration.ConfigurationException: java.lang.NullPointerException
at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:283)

    我们在出错之前,如果将此时的url打印出来,结果URL是以wsjar:开头的一个形式。我们此时只需做如下简单的转换,就可以让代码正常工作:

URL url = PropertyGetter.class.getClassLoader().getResource("myconfig.xml");//你将myconfig.xml打在某个jar包中 //加入url转化代码 String urlStr=url.toString(); if(urlStr.startsWith("wsjar:"){ urlStr=urlString.substring(2); url=new URL(urlStr); } //转转换结束 factory.setConfigurationURL(url);

    现在你应该明白了,为什么会在websphere中报wsjar有关的错误了吧。也许你会说,只要我们自己写代码时将wsjar的情况考虑进去不就可以避免了吗?是的,如果我们自己的应用考虑到了wsjar的情况,那么只能说我们自己的代码在websphere运行不会出现类似的问题,但是在许多情况下,我们所使用的开源技术的在很多情况下也会使用 XXXClass.class.getClassLoader().getResource("xxx.properties")的形式,那么如果他们自己没有考虑wsjar的情况,那么他们内部就会报出wsjar相关的错误,这样整个应用也往往因此而启动失败。

0
相关文章