jboss 中,jdk版本不兼容问题的深入探究

(1).
今天,详细研究了在jdk1.6下,jboss4.2 不能正常工作的问题。
出现了如下错误:
setProperty must be overridden by all subclasses of SOAPMessage。。。

出现这个错误的根源,分析如下:
jbossws-client.jar 中有一个类叫做:SOAPMessageImpl, 它的版本是1.5
jboss-saaj.jar 中有一个类叫做 SOAPMessage(这是一个类,而不是一个接口,需要继承),它的版本也是1.5
setProperty 和 getProperty 方法都实现了。

javaee.jar 中也有 SOAPMessage 类,
setProperty 和 getProperty 方法都没有实现。

javaee.jar 和 jboss-saaj.jar 可以共存,系统自动调用 jboss-saaj.jar。
(经验证,与顺序无关,但是不知道为什么可以很好的工作)

但是,当我们使用jdk1.6时,jdk 中包括了新版本的SOAPMessage,
这个新 SOAPMessage 的 setProperty 方法抛出了 UnsupportedOperationException,出现了版本不兼容的问题。
在jdk1.5中并没有这个类。

尝试的解决方法如下:
(a). 将jboss-4.2.3.GA-jdk6中的jbossws-client.jar,拷贝到客户端
问题不能解决。
原因是SOAPMessageImpl并没有override setProperty 方法。

(b). 将jboss-5.1.0.GA-jdk6中的jbossws-native-core.jar,拷贝到客户端
问题不能解决。
原因是SOAPMessageImpl并没有override setProperty 方法。

(c). 将jboss-6.0.0.M2中的jbossws-native-core.jar,拷贝到客户端
问题部分解决,但是这个解决方案并不能被客户接受。
原因是,jboss-6.0.0.M2 只能支持jdk1.6(当加载到jbossws-native-core.jar中类时,出现了错误)
如果在jdk1.5版本下使用,会出现Bad version number in .class file

(2).

Java endorsed 目录的问题

endorsed 这个单词很少见:金山在线词典上endorse的翻译是:
endorse
vt.
在票据背面签名; 背书
签署, 签注, 批注(公文等), [英]在(驾驶员执照)上注明违章录
承认, 认可, 赞成, 担保
[南非]把(进入城市的黑人)强制送回农村(out)
endorse off
背书证明支取一部分票面金额
endorse over
背书(票据等)将所有权让与(别人)
第四条比较符合这里的意思,这个目录里面放置的jar文件,将有覆盖系统API的功能。可以牵强的理解为,将自己修改后的API打入到虚

拟机指定的启动API中,取而代之。

今天,为了修复Java6对javascript支持中的一个bug,
我覆盖了系统API(sun.org.mozilla.javascript.internal.TokenStream)。

可是,当我吧修改后代码的jar发布到jdk/lib/目录下下的endorsed 目录里后从新运行测试,确发现修改并没有生效。

仔细检查后发现,系统属性并没有如我期望的那样指向javaw.exe所在的jdk目录中,而是指向了额外安装的jre目录下。

我运行的jre javaw.exe位置是:
C:/Program Files/Java/jdk1.6.0_02/bin/javaw.exe
我想,endorsed目录,应该就指向
C:/Program Files/Java/jdk1.6.0_02/lib/endorsed

System.out.println(System.getProperty(“java.endorsed.dirs”));后发现,他意外的指向了:
C:/Program Files/Java/jdk1.6.0_02/jre/lib/endorsed

请参考这里
(3).
如何在 JDK6 下使用 JBoss 5 AS 的 Web Service:

JBoss 5(测试的JBoss版本为jboss-5.0.1.GA-jdk6) 中的 Web Service 实现所使用的 JAX-WS 和 JAXB 版本是 2.1,但 JDK6 中带的

JAX-WS 与 JAXB 版本却是 2.0。如果无视这个问题,使用 wsimport 指令生成 Web Service 客户端将无法工作。要解决该问题,比较

快捷的办法是将 JDK6 的 JAX-WS 和 JAXB 支持升级到 2.1。
升级 JDK6 的 JAX-WS 与 JAXB

在 JBoss 5 的 lib/endorsed 目录中有如下库:
jaxb-api.jar
jbossws-native-jaxrpc.jar
jbossws-native-jaxws.jar
jbossws-native-jaxws-ext.jar
jbossws-native-saaj.jar
xercesImpl.jar
将它们拷贝到 JAVA_HOME/lib/endorsed 和 JRE_HOME/lib/endorsed 目录下便可支持 JAX-WS 与 JAXB 2.1。



转自:http://www.wenjiesu.com/blog/?p=64

你可能感兴趣的:(jboss)