我最近在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个步骤”听起来更好。
请编辑这篇文章,如果你发现有遗漏,请加以改进!