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

原文地址:http://apps.hi.baidu.com/share/detail/39968108

(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。

一、运行环境配置

1. 安装JDK5.0

2. 到jboss官方网下载jboss4.2.3GA.zip,解压即可。下载地址如果项测试jboss是否成功,设置系统变量变量名:JBOSS_HOME 值:JBOSS的解压路径。同时看一下系统变量中有没有变量JAVA_HOME,如果没有定义它,名JAVA_HOME,值:JDK的安装路径,例如:C:\Sun\SDK\jdk.

3. 测试是否成功,双击D:\jboss-4.2.3.GA\bin中的run,开始在doc下运行直到出现09:44:08,875 INFO [Server] JBoss (MX MicroKernel) [4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181417)] Started in 17s:219ms.然后在IE中输入:http://localhost:8080/进入jboss界面,如果有需要密码的地方都是admin。

4. 如果你在jbossIDE中启动测试JBOSS服务不需要设置环境变量。打开Jbuilder2008,它的使用特别方便。选择windowspreferences,出现preferences界面,点击serverruntime environment,点击右边的Add按钮,出现如下图的窗口,

 

选择jboss的版本点击next,出现

 

Application server diractory中选择jboss所在的路径。完成。打开windows->show view选择server-servers窗口。

 

在server窗口点击右键选择new server,

 

点击运行按钮开始运行,

 

成功启动在console窗口中最后09:44:08,875 INFO [Server] JBoss (MX MicroKernel) [4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181417)] Started in 17s:219ms。界面,

 

双击console窗口,

 

然后在IE中输入:http://localhost:8080/进入jboss界面,如果有需要密码的地方都是admin。启动中若出现8080端口被占用的情况jboss所用端口如1099,1098 ,8080, 8083等端口)。可以下载端口查看器(Active Ports)进行检查,如果端口被占用就关闭此进程。

猜你喜欢

转载自catkingwong.iteye.com/blog/1470015
今日推荐