我正在寻找除Sun SAAJ之外的替代SOAP(javax.xml.soap
)实现。原因是因为我想在IBM JDK 5驱动的Tomcat AS上部署JAX-WS WebService,但是已知问题是Sun SAAJ实现依赖于重新分配的Xerces类(请参阅Ref Impl does not work with IBM JDK和SAAJ test cases no longer work with IBM's SDK并且唯一的出路就是使用自定义Maven配置文件来拉com.sun.xml.parsers:jaxp-ri
,如:
<profiles>
<profile>
<id>pre-jdk5-profile</id>
<activation>
<jdk>(,1.4]</jdk>
</activation>
<dependencies>
<dependency>
<groupId>com.sun.xml.parsers</groupId>
<artifactId>jaxp-ri</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>
</profiles>
我想删除此配置文件,只需将SOAP实现替换为适用于任何地方的实现。
我认为供应商SOAP实现可能带有Apache Axis / Apache CXF(基于IBM SOAP4J)或JBoss AS - 请根据我的偏好提供信息:
参考文献:
答案 0 :(得分:7)
浏览后,我得到了以下潜在的问题解决方案。我使用grepcode.com探索了javax.xml.soap.MessageFactory
的后代。
除标准com.sun.xml.messaging.saaj.soap.MessageFactoryImpl
外,我发现(假设):
org.apache.axis2:axis2-saaj:1.6.1
中org.apache.axis2.saaj.MessageFactoryImpl
。此JAR通过META-INF\services\javax.xml.soap.MessageFactory
和META-INF\services\javax.xml.soap.MetaFactory
正确宣布工厂,因此无需进行其他调整。这个版本(根据Maven Central)于2011年发布,很少有依赖,推荐。org.jboss.ws.core.soap.MessageFactoryImpl
中的org.jboss.ws.native:jbossws-native-core:3.2.1.Beta2
。看起来相当古老,也许JBoss不再支持它的开发,因为我能够在maven central(here)之外找到这个jar。很多依赖项,1.8M大小,不推荐。org.apache.openejb.server.webservices.saaj.MessageFactoryImpl
位于org.apache.openejb:openejb-webservices:4.0.0-beta-2
和org.apache.geronimo.webservices.saaj.GeronimoMessageFactory
位于org.apache.geronimo.modules:geronimo-webservices:3.0-M1
。实际上,这些工厂中的任何一个都是Axis2或Sun实现的包装器/ runtime_locator(请参阅SaajFactoryFinder
和SAAJFactoryFinder
)。不予考虑。底线:唯一可接受的替代方案是Axis2实施。
答案 1 :(得分:0)
虽然我不知道您确切问题的答案,但我有一个解决方案,您可以如何使Sun SAAJ(和JAX-WS RI)在JRE 1.5下运行。在Java 5下运行JAX-WS RI的问题确实是过时的JAXP(Java 1.5附带JAXP 1.3,而JAX-WS RI需要JAXP 1.4),因为JAX-WS RI是硬编码使用的Sun JAXP RI(com.sun.org.apache ...)。由于JAXP 1.3是JRE的一部分,因此您无法简单地替换它(您可以替换实现,但不能替换API)。 解决方案是activesoap的xerces端口,它是一个使用Sun JAXP RI包命名(com.sun.org.apache。)的简化JAXP 1.4版本。 你可以在Maven回购中找到它:
<dependency>
<groupId>activesoap</groupId>
<artifactId>jaxb-xercesImpl</artifactId>
<version>1.5</version>
</dependency>
不要介意奇怪的软件包命名 - 只需尝试一下。
这通常是在Java 5下运行Sun JAX-WS RI(以及SAAJ作为其一部分)所需的全部内容。
请勿忘记不要包含任何JAXP API JAR。它们将与Java 5 JAXP API发生冲突。
答案 2 :(得分:0)
艰难的一个。也许看一下Apache CXF版本。 http://cxf.apache.org/
您可能想要尝试翻转类加载器,将您需要的jar与Web应用程序捆绑在一起并加载到PARENT_LAST模型中。这可能是你最好的选择。
Tomcat中的第三个选项可能是Java和Tomcat支持的Endorsed Standards Override Mechanism。 -Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS
请看这里,我认为它适用于较早版本的Tomcat:http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html#XML_Parsers_and_Java。