java - 使用 ant 让 JAX-WS 客户端在 Weblogic 9.2 上工作

标签 java web-services ant jax-ws weblogic9.x

我最近在尝试在 Weblogic 9.2 上部署 JAX-WS Web 服务客户端时遇到了很多问题。事实证明,没有关于如何实现这一点的直接指南,所以我决定整理这个简短的 wiki 条目,希望它对其他人有用。

首先,Weblogic 9.2 一般不支持使用 JAX-WS 的 Web 服务。它带有与最新的 JAX-WS 不兼容的旧版本的 XML 相关 java 库(类似的问题出现在 Axis2 上,只有 Axis1 似乎可以完美地与 Weblogic 9.x 一起工作,但这是一个非常古老且不受支持的库)。

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

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

2.将 JAX-WS jar 与依赖项放在单独的文件夹中,例如 lib/webservices

3.在 ant 中创建一个模式集来引用这些 jars:

<?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.将模式集包含在您与 WAR 相关的目标中。这可能看起来像:

<?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>

(不是 flatten="true" 参数 - 这很重要,因为默认情况下 Weblogic 9.x 不够智能,无法访问位于与 WAR 中的 WEB-INF/lib 不同的位置的 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 文件放入您的 EAR 中! Ant 的目标可能类似于:

<?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 服务 stub 和类,并将它们放在应用程序的文件夹中:

<?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 服务集成测试至关重要。

9.我们快到了。最后一件事是编写一个 Java 类来测试 Web 服务,首先尝试将其作为独立应用程序运行(或作为单元测试的一部分)

10.然后尝试使用 Weblogic 运行相同的代码。它应该工作。它对我有用。经过大约 3 天的挫折。 是的,我知道我应该将 9 和 10 放在一个要点下,但是标题“使用 ant 在 Web 逻辑 9.2 下部署 JAX-WS Web 服务的 10 个步骤”听起来好多了。

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

最佳答案

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

关于java - 使用 ant 让 JAX-WS 客户端在 Weblogic 9.2 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881411/

相关文章:

java - 在ant中同时复制和重命名目录

c# - Web 引用中断 SSIS 包

java - Spring JDBCTemplate : is it okay to call a DAO method inside RowMapper?

java - Windows 上的 Android jar/dex 方法计数

Java Spring 启动异步方法偶尔不会被调用

asp.net - 没有端点监听并且错误 404

java - 在 Eclipse 中使用和测试 Web 服务

ant - 使用普通 ant 并以文件名作为参数为文件集中的每个文件调用一个任务(没有 contrib 任务,没有自己的任务)

android - CrashLytics Android 集成问题

java - java中如何获取图片大小