代码之家  ›  专栏  ›  技术社区  ›  middus

使用Ant让JAX-WS客户机在WebLogic9.2上工作

  •  4
  • middus  · 技术社区  · 6 年前

    我最近在WebLogic9.2上部署JAX-WSWebServicie客户机时遇到了很多问题。事实证明,在如何实现这一点上没有直接的指导,所以我决定把这个简短的wiki条目放在一起,希望它对其他人有用。

    首先,WebLogic9.2一般不支持使用JAX-WS的Web服务。它带有与XML相关的Java库的旧版本,这些库与最新的JAX-WS不兼容(类似的问题发生在AxIS2上,只有AxIS1似乎与WebLogic 9 x完美地工作,但这是一个非常古老和不支持的库)。

    因此,为了让它正常工作,需要进行一些黑客攻击。我就是这样做的(请注意,我们在遗留的公司项目中使用了Ant,您可能应该使用Maven,它将消除下面50%的步骤):

    1.从下载最新的JAX-WS分发 https://jax-ws.dev.java.net/ (我得到的确切版本是jaxws2.2-20091203.zip)

    2.将带有依赖项的JAX-WS JAR放在一个单独的文件夹中,如 LIB/WebServices .

    3.在Ant中创建一个模式集以引用这些jar:

    <?xml version="1.0"?>
    <patternset id="jaxws.classpath">
    <include name="webservices/jsr173_api.jar" />  
    <include name="webservices/jsr181-api.jar" />       
    <include name="webservices/jaxb-api.jar" />
    <include name="webservices/jaxb-impl.jar" />
    <include name="webservices/jaxb-xjc.jar" /> 
    <include name="webservices/jaxws-tools.jar" />
    <include name="webservices/jaxws-rt.jar" />       
    <include name="webservices/jaxws-api.jar" />
    <include name="webservices/policy.jar" />
    <include name="webservices/woodstox.jar" />   
    <include name="webservices/streambuffer.jar" />       
    <include name="webservices/stax-ex.jar" />
    <include name="webservices/saaj-api.jar" />
    <include name="webservices/saaj-impl.jar" />
    <include name="webservices/gmbal-api-only.jar" />   
    </patternset>
    

    4.将模式集包含在与战争相关的目标中。这可能看起来像:

    <?xml version="1.0"?>
    <copy todir="${wardir.lib}" includeEmptyDirs="false" flatten="true">
    <fileset dir="${libs}">
    <!--lots of libs here, related to your project -->
    <patternset refid="jaxws.classpath"/>
    </fileset>
    </copy>
    

    (不是) “真” 参数-这一点很重要,因为WebLogic9.x在默认情况下不够智能,无法访问与您的war文件中的WEB-INF/LIB不同的lcation中的JAR)

    5.如果发生冲突,WebLogic默认使用自己的JAR。我们希望它使用来自我们的应用程序的JAX-WS JAR。这是通过准备 weblogic-application.xml文件 文件并将其放在部署的EAR文件的META-INF文件夹中。它应该是这样的:

    <?xml version="1.0"?>
    <weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <prefer-application-packages>
        <package-name>javax.jws.*</package-name>
        <package-name>javax.xml.bind.*</package-name>
        <package-name>javax.xml.crypto.*</package-name>
        <package-name>javax.xml.registry.*</package-name>
        <package-name>javax.xml.rpc.*</package-name>
        <package-name>javax.xml.soap.*</package-name>
        <package-name>javax.xml.stream.*</package-name>
        <package-name>javax.xml.ws.*</package-name>
        <package-name>com.sun.xml.api.streaming.*</package-name>
    </prefer-application-packages>
    </weblogic-application>
    

    6.记住放置 weblogic-application.xml文件 把文件放在你耳朵里!蚂蚁的目标可能类似于:

    <?xml version="1.0"?>
    <target name="build-ear" depends="war, manifest">
        <delete dir="${dist}"/>
        <mkdir dir="${dist}"/>    
        <jar destfile="${warfile}" basedir="${wardir}"/>        
        <ear destfile="${earfile}" appxml="resources/${app.name}/application.xml">
            <fileset dir="${dist}" includes="${app.name}.war"/>
            <metainf dir="resources/META-INF"/>     
        </ear>
    </target>
    

    7.此外,您还需要告诉WebLogic,您的WEB-INF类要比发行版中的类更受欢迎。您可以通过在 WEB-INF/weblogic.xml文件 文件:

    <?xml version="1.0"?>
    <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
    </container-descriptor>
    

    8.这就是WebLogic相关配置。现在只设定你的JAX-WS目标。下面的一个简单地基于本地部署的WSDL文件生成Web服务存根和类,并将它们放在应用程序的文件夹中:

    <?xml version="1.0"?>
    <target name="generate-jaxws-client">
            <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"> 
                <classpath path="classpath.main"/>
            </taskdef>          
            <wsimport 
                 destdir="${src}"
                 package="acme.somewhere.in.your.package.tree.webservices."
                 keep="true" 
                 wsdl="http://localhost:8088/mockWebService?WSDL">              
            </wsimport>
        </target>   
    

    记住keep=“true”参数。如果没有它,wsimport将生成类并…删除它们,信不信由你!

    对于模拟Web服务,我建议使用开放源代码项目soapui。非常容易部署,对于Web服务集成测试至关重要。

    我们就快到了。最后一件事是编写一个Java类来测试Web服务,试着先把它作为一个独立的应用程序运行(或者作为单元测试的一部分)。

    10.然后尝试用WebLogic运行相同的代码。它应该能工作。这对我很有用。在经历了3天的挫折之后。 是的,我知道我应该把9和10放在一个重点下,但是标题“使用Ant在Web逻辑9.2下部署JAX-WS Web服务的10个步骤”听起来更好。

    请编辑这篇文章,如果你发现有遗漏,请加以改进!

    2 回复  |  直到 14 年前
        1
  •  2
  •   michuk    14 年前

    这不是一个真正的问题,而是一个指导,所以我自己回答它只是为了把它标记为完成。

        2
  •  2
  •   michuk    14 年前

    在WebLogic9.2上处理Web服务的另一种方法是使用ApacheCXF。这与Spring集成得特别好,因为每个Web服务都作为bean公开,而实际的类甚至不需要知道它们是Web服务,都是由配置驱动的。

    有关在WebLogic上设置ApacheCXF的很好的指南可以在这里找到: http://wheelersoftware.com/articles/spring-cxf-web-services.html

    这同样适用于WebLogic9.2,如果您需要公开Web服务,而不仅仅是连接到现有的服务,那么这比使用普通的JAXWS(无论如何,CXF都使用)要好得多。