简单就是美!

超越黎明

俞黎敏ID:YuLimin
81405次访问,排名1055好友17人,关注者210
阿敏总司令:简单就是美!
博客:http://YuLimin.JavaEye.com

只有正确地找到问题的根本所在,才能成功地解决掉问题:)
Read a bit and take it out, then come back read some more.
YuLimin的文章
原创 62 篇
翻译 0 篇
转载 0 篇
评论 65 篇
阿敏总司令的公告
三等功
俞黎敏
阿敏总司令
来自:福建莆田@广州
最近评论
yd1221:ǒu lái nǐ de dì pán cǎi cǎi ,hē hē ,xī wàng yě dào wǒ de dì pán zhuǎn zhuǎn ɑ !
偶 来 你 的 地 盘 踩 踩 ,呵 呵 ,希 望 也 到 我 的 地 盘  转  转 啊 !



 — 快典网( http://kdd.cc/ )自动注音
myshijieye:love注册香港公司
健康管理
pvc door
服装批发
jamesqiu:花点时间学习gvim,这是值得的。
007pro:je上核心人员都是极端务实的人群,有时候我觉得怎么可以这样,je的核心会觉的说,最好这样~就是这么简单。
我也是被隐藏扣分之后才明白,所以即便是博客上也对这类事情不做评述,虽然我是很支持你的
所以即便象俞兄这样的用户也不会有特权的,我记得老庄很久以前叹息说多亏有自己的空间,的确如此。
oneyear2008:我刚接触java,这对于我来说是一个很好的学习步骤!谢谢!
文章分类
收藏
    相册
    1大学的我
    2部队当兵
    3生活相片
    CSDN好友
    【HongSoft@业务整合】(RSS)
    axman
    Java憩园
    jini李日贵
    lizongbo
    zxhong(RSS)
    椅子(HERO2008第三会场主持人)
    用耳朵去聆听,用心来感受
    苏酩的Blog空间
    超越黎明(RSS)
    银狐999(RSS)
    青润心情(RSS)
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计收藏

    新一篇: Spring 2.5 Perfomance Improvements 200% 直逼 Guice

    http://yulimin.javaeye.com/blog/129015

    同样的程序在 Tomcat 5.5.16/25 以及 Jetty 5.1.12 上都能够成功部署及运行,但是部署到 WebLogic 9.2 上时出错
    org.springframework.web.context.ContextLoader initWebApplicationContext
    FATAL: Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxWebService': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: portName
    Caused by: java.lang.NoSuchMethodError: portName
    at org.apache.cxf.jaxws.support.JaxWsImplementorInfo.getEndpointName(JaxWsImplementorInfo.java:154)
    at org.apache.cxf.jaxws.support.JaxWsServiceConfiguration.getEndpointName(JaxWsServiceConfiguration.java:89)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.getEndpointName(ReflectionServiceFactoryBean.java:983)
    at org.apache.cxf.frontend.AbstractEndpointFactory.createEndpoint(AbstractEndpointFactory.java:91)
    at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:107)
    at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:147)
    at jrockit.reflect.VirtualNativeMethodInvoker.invoke(Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)
    at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1179)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1145)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:279)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:360)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:241)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)

    从 Stack Trace 来分析,Spring 在 ContextLoaderListener 进行加载配置文件时出错了。
    通过查看 JaxWsImplementorInfo.java:154 的源程序
    代码
    portName = wsAnnotations.get(x).portName();  

    可以知道 wsAnnotations 的定义为
    代码
    private List<WebService> wsAnnotations = new ArrayList<WebService>(2);  

    得到List里的对象类型为WebService,并得到全称为javax.jws.WebService
    通过 JarClassFind 来搜索,可以得到 Apache CXF 中的 geronimo-ws-metadata_2.0_spec-1.1.1.jar 包含有这个类
    而 WebLogic 9.2 中的则有两个 .jar 文件包含有此类:
    No.1
    Jar Package:%WLS_HOME%/server/lib/api.jar
    No.2
    Jar Package:%WLS_HOME%/server/lib/weblogic.jar
    经过对比,WebLogic 9.2 里的两个 .jar 文件里带个类是一样的,况且,正常启动时 WebLogic 也只是将 weblogic.jar 加到 CLASSPATH 中。

    问题猜测应当是由于这两类的版本不一样导致的,拆出来 jad 一下,WebLogic 中的 javax.jws.WebService.java 代码为:
    代码
    package javax.jws;  
     
    import java.lang.annotation.Annotation;  
     
    public interface WebService  
        extends Annotation  
    {  
     
        public abstract String name();  
     
        public abstract String targetNamespace();  
     
        public abstract String serviceName();  
     
        public abstract String wsdlLocation();  
     
        public abstract String endpointInterface();  
    }  

    拆出 Apache CXF 里的 javax.jws.WebService jad 一下,代码为:
    代码
    package javax.jws;  
     
    import java.lang.annotation.Annotation;  
     
    public interface WebService  
        extends Annotation  
    {  
     
        public abstract String name();  
     
        public abstract String targetNamespace();  
     
        public abstract String serviceName();  
     
        public abstract String wsdlLocation();  
     
        public abstract String endpointInterface();  
     
        public abstract String portName();  
    }  

    这下就完全明白了,是 Apache CXF 期望加载的 javax.jws.WebService 注解与 Weblogic 中 javax.jws.WebService 注解版本不一致导致的。

    OK,现在首先想到的是在 weblogic.xml 设置 prefer-web-inf-classes 为 true 来提前加载了。如下:
    代码
    <?xml version="1.0" encoding="UTF-8"?>  
    <weblogic-web-app>  
        <container-descriptor>  
            <prefer-web-inf-classes>true</prefer-web-inf-classes>  
        </container-descriptor>  
    </weblogic-web-app>  

    总以为能够象往常一样,这样可以了,但是将 prefer-web-inf-classes 设置为 true 后,却发生了另一个异常了:
    代码
    FATAL: Context initialization failed  
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxWebService': Invocation of init method failed; nested exception is java.lang.LinkageError: Class javax/xml/namespace/QName violates loader constraints  
    Caused by: java.lang.LinkageError: Class javax/xml/namespace/QName violates loader constraints  
            at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl.<clinit>(RuntimeBuiltinLeafInfoImpl.java:186)  
            at com.sun.xml.bind.v2.model.impl.RuntimeTypeInfoSetImpl.<init>(RuntimeTypeInfoSetImpl.java:25)  
            at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:84)  
            at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.createTypeInfoSet(RuntimeModelBuilder.java:41)  
            at com.sun.xml.bind.v2.model.impl.ModelBuilder.<init>(ModelBuilder.java:104)  
            at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.<init>(RuntimeModelBuilder.java:49)  
            at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:372)  
            at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:236)  
            at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:76)  
            at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:55)  
            at jrockit.reflect.InitialMethodInvoker.invoke(Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source)  
            at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source)  
            at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:210)  
            at javax.xml.bind.ContextFinder.find(ContextFinder.java:366)  
            at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)  
            at org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContext(JAXBDataBinding.java:377)  
            at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:182)  
            at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:244)  
            at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:272)  
            at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:146)  
            at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:89)  
            at org.apache.cxf.frontend.AbstractEndpointFactory.createEndpoint(AbstractEndpointFactory.java:83)  
            at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:107)  
            at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:147)  

    面对这个 java.lang.LinkageError: Class javax/xml/namespace/QName 错误,自然又联想到了版本不一致的问题。
    继续 JarClassFind ,在 Apache CXF 里找到 stax-api-1.0.1.jar 包含有这个类。
    No.1
    Jar Package:%WLS_HOME%/server/lib/api.jar
    No.2
    Jar Package:%WLS_HOME%/server/lib/weblogic.jar
    No.3
    Jar Package:%WLS_HOME%/server/lib/webserviceclient+ssl.jar
    No.4
    Jar Package:%WLS_HOME%/server/lib/webserviceclient.jar
    No.5
    Jar Package:%WLS_HOME%/server/lib/xbean.jar
    同样与 WebLogic 启动时有关的仍是 weblogic.jar ,怪异的是 WebLogic 中居然有三个版本的 javax/xml/namespace/QName 这个类,真是比较糟糕的事情。
    api.jar、weblogic.jar 与 webserviceclient+ssl.jar、webserviceclient.jar 和 xbean.jar 中各是一个版本。

    但是通过 jad 发现 weblogic 里的 javax/xml/namespace/QName 与 Apache CXF 里的是一样的,比较奇怪了。。。
    再进行认真地比较发现,文件的时间不同,再直接进行对比 .class 文件,还是有两处有不同之处。Apache CXF 的时间晚于 WebLogic 里的类的时间,于是只能怀疑后者引起类在加载时发生了 java.lang.LinkageError 错误。
    经查JDK文档:LinkageError 的子类指示一个类在一定程度上依赖于另一个类;但是,在编译前一个类之后,后一个类发生了不相容的改变。

    于是真相大明了?因为 Apache CXF 里的类的时间晚于 WebLogic 里的类的时间,而且类的二进制内容也发生了改变,于是原来 WebLogic 里的其它类由于我们通过了 prefer-web-inf-classes 设置为 true 后,而引用到了现在的 Apache CXF 里的类了,就发生了 java.lang.LinkageError 错误。

    由于设置 prefer-web-inf-classes 设置为 true 后,提前加载了应用程序中 lib 目录下的 .jar 文件,而发生了这个问题,于是就尝试去掉 prefer-web-inf-classes 的设置,直接在 WebLogic 的启动脚本中增加第一次异常时相关的 jar 到 CLASSPATH 中,即 geronimo-ws-metadata_2.0_spec-1.1.1.jar 文件,只提前加载这个 jar 文件。
    代码
    set CLASSPATH_CXF=X:/xyz/geronimo-ws-metadata_2.0_spec-1.1.1.jar  
    set CLASSPATH=%CLASSPATH_CXF%;%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%  

    于是,再次进行启动,这下则可以正常启动了。

    为了支持 Aegis ,除了必需的之外,还需要再增加如下 jar 包:
    - jaxen.jar
    - jdom.jar
    - stax-utils.jar 

    发表于 @ 2007年10月03日 20:41:00|评论(loading...)|编辑

    旧一篇: Lotus 8.0基于Eclipse平台,IBM的产品线都向Eclipse靠紧了?

    评论

    #jiangningning 发表于2007-10-22 21:52:10  IP: 222.131.246.*
    这可以参考Xfire的解决方案
    http://xfire.codehaus.org/XFire+on+WebLogic+9.2
    同时CXF wiki上也有对应的解决方案
    http://cwiki.apache.org/confluence/display/CXF20DOC/AppServerGuide
    #yangtaogg 发表于2007-11-20 00:13:30  IP: 221.201.164.*
    lz当过兵??偶也是,2001年的,呵呵,
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 阿敏总司令