Apache CXFのWebLogic 9.2における問題ポジショニング分析及び便宜上の措置


同じプログラムはTomcat 5.5.16/25及びJetty 5.1.12で全部成功的に配置と運行ができますが、WebLogic 9.2への配置が間違っています。
org.spring frame ework.web.com ntxt.Controtext.Loader init WebApplication Context
FATAL:Contect initialization failed
org.springframe exWebService::Invocation of init method failed;neted exception is java.lang.NoSuchMethodErr:portName
Caused by:java.lang.NoSuchMethodErr:portName
        at org.apphe.cxf.jaxws.support.JaxWsImplements Info.get EndpointName(JaxWs Implements.java:154)
        at org.apphe.cxf.jaxws.support.JaxWs ServiceConfigrations.get EndpointName(JaxWs ServiceConfigrations.java:89)
        at org.apacthe.cxf.servicer.factory.Reflection ServiceFactoryBenn.get EndpointName(Reflection ServiceFactory Bern.java:983)
        at org.apacthe.cxf.frontend.Abstract EntpointFactory.reate Endpoint(Abstractory.java:91)
        at org.apactory.cxf.frontend.Server FactoryBenc reate(ServerFactoryBean.java:107)
        at org.apache.cxf.jaxws.JaxWs Server FactoryBean.reat(JaxWs ServerFactoryBean.java:147)
        at jrockit.reflect.Virtual NativeMethod Invoker.invoke(Ljava.lang.Object)Ljava.lang.Object;)Ljava.lang.ObjectUnknown Source)
        at java.lang.reflect.Method.invoke(Ljava.lang.Object)Ljava.lang.ObjectI)Ljava.lang.Object;Unknown Source)
        at org.springframe ework.beans.factory.support.Abstract AutowireCapable BenFactory.invoke CutomInitMethod(Abstractory AutowireCable BenFactory.java:1214)
        at org.springframe ebook.beans.factory.support.AbstractAutowireCable BenFactory.invokeInitMethods(Abstractory.AutowireCable Beable Factory.java:1179)
        at org.springframe ework.beans.factory.support.Abstract AutowireCable Beable Factory.initializan(Abstractory.AutowireCable BenFactory.java:1145)
        at org.springframe ewark.beans.factory.support.Abstract AutowireCapable Beable Factory.creatBean(Abstractory.java:427)
        at org.springframe ebook.beans.factory.support.AbstractBenFactory$1.get Object(Abstractory.java:251)
        at org.springframe ework.beans.factory.support.DefaultSingleton BenRegistry.get Singleton(DefaultSingleton BenRegistry.java:144)
        at org.springframe ewark.beans.factory.support.AbstractBenFactory.getBen(Abstractory.java:248)
        at org.springframe ebook.beans.factory.support.AbstractBenFactory.get Bern(Abstractory.java:160)
        at org.springframe ewark.beans.factory.support.DefaultListable BenFactory.preInstantiateSingletons(Default Listable BenFactory.java:279)
        at org.springframe ework.com.support.AbstractAplication Contact.refresh(Abstract Application Contact.java:360)
        at org.springframe ewark.web.com ntxt.Controtext.Loader.create WebAppleication Contect(Contect Loader.java:241)
        at org.springframe ework.web.com ntxt.Continit WebAppleication Conteet(Contect Loader.java:184)
        at org.springframe ework.web.co.ntenxt.cn text Loader Listener.co.ntenxt Initialized(Conttext Loader Listener.java:49)
Stock Traceから分析すると、SpringはContect Loader Listenerで設定ファイルをロードする際にエラーが発生しました。
JaxWs ImplemenntorInfo.java:154のソースプログラムを見ることにより

portName = wsAnnotations.get(x).portName();
ws Annotationsの定義が分かります。

private List<WebService> wsAnnotations = new ArrayList<WebService>(2);
Listの対象のタイプはWebServiceであり、全体の名前はjavax.jws.WebServiceです。
JarClass Findで検索すると、Apache CXFの中のgeronimo-ws-metadata_を得ることができます。2.0_spec-1.1.11.jarにはこのクラスが含まれています。
WebLogic 9.2には二つがあります。jarファイルにはこのようなものが含まれています。
No.1
Jar Package:%WLS_HOME%/server/lib/appi.jar
No.2
Jar Package:%WLS_HOME%/server/lib/weblogic.jar
対比してみると、WebLogic 9.2の中の二つです。jarファイルにはクラスがあります。それに、正常起動時のWebLogicもweblogic.jarをCLAS SPATHに加えるだけです。
問題の推測はこの2つのバージョンが違っているので、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();
}
Appache 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-clasesを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-clasesを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エラーに直面して、自然にまたバージョンの不一致の問題を連想しました。
引き続きJarClass Findは、Apache CXFでstax-appi-1.0.1.jarが含まれています。
No.1
Jar Package:%WLS_HOME%/server/lib/appi.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の中でそれぞれ1つのバージョンです。
しかし、jadを通じてweblogicのjavax/xml/namespace/QNameはAppache CXFと同じであることが分かりました。
真剣に比較してみると、書類の時間が違っています。直接比較します。クラスの文書には、二つの違いがあります。Apache CXFの時間はWebLogicのクラスの時間より遅いので、後者の種類はローディング時にjava.lang.LinkageErrエラーが発生したと疑わざるを得ません。
JDK文書を調べます。LinkageErrのサブクラスは、クラスがある程度別のクラスに依存することを示します。しかし,前のクラスをコンパイルした後,後者のクラスは相容れない変化を生じた。
そして真相が明らかになった?Apache CXFのクラスの時間はWebLogicのクラスの時間より遅く、またクラスのバイナリの内容も変わったので、WebLogicの他のクラスはprefer-web-inf-clasesを通してtrueに設定したので、今のApache CXFのクラスに引用しました。javangkaror.Errエラーが発生しました。
prefer-web-inf-clasesをtrueに設定した後、アプリケーションのLibディレクトリのJarファイルを事前にロードしました。この問題が発生しました。prefer-web-inf-clasesの設定を削除して、WebLogicの起動スクリプトに直接に最初の異常時に関連するjarをCLASATHに追加します。すなわち、mogenita-mosts2.0_spec-1.1.11.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