出现异常:java.util.ServiceConfigurationError - java

运行我的应用程序时遇到以下异常:

我正在使用jboss:5.1.1和jdk 1.6。

01:50:04,828 ERROR [[HelloWorld]] Servlet.service() for servlet HelloWorld threw exception
java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.jboss.ws.core.jaxws.spi.ProviderImpl not a subtype
    at java.util.ServiceLoader.fail(Unknown Source)
    at java.util.ServiceLoader.access$300(Unknown Source)
    at java.util.ServiceLoader$LazyIterator.next(Unknown Source)
    at java.util.ServiceLoader$1.next(Unknown Source)
    at javax.xml.ws.spi.Provider.getProviderUsingServiceLoader(Provider.java:146)
    at javax.xml.ws.spi.Provider.provider(Provider.java:106)
    at javax.xml.ws.Service.<init>(Service.java:57)
    at com.service_instance.ServiceInstance.<init>(ServiceInstance.java:50)
    at com.getBusinessApp(CMDB.java:239)
    at com.test.HelloWorld.doGet(HelloWorld.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)

让我知道。如何解决这个问题。似乎是一些lib问题。

参考方案

我在使用Mobicents Jain Slee部署在JBoss AS 5.1.0 GA之上运行USSD网关时遇到了同样的问题。网关必须通过SOAP连接到服务器,因此我选择了JAX-WS并使用wsimport从WSDL中生成了源代码。
顺便说一下,我使用了与this one类似的过程来创建一个子Maven项目并为JAX-WS生成Java文件。

在.war文件中嵌入依赖项的情况下,部署失败
我的第一种方法是将所有依赖项包含在JBoss中部署的.war文件中。
我认为这是在Maven中默认实现的,而mvn install会做到这一点。
从长远来看,这种方法失败了,但是至少我需要知道.war文件中包含的jar文件列表,以便稍后将它们复制到JBoss目录中。
我使用这种方法进行了大量的故障排除,并且有许多不同的日志错误,尽管主要的错误是:

java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.jboss.ws.core.jaxws.spi.ProviderImpl not a subtype

无依赖部署
Maven调整
因此,我将<scope>provided</scope>添加到JAX-WS依赖项中。就像是:

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.sun.istack</groupId>
    <artifactId>istack-commons-runtime</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>

这产生了一个轻得多的.war文件。
在JBoss AS中复制和删除jar
现在,在部署.war文件之后,当我的SOAP客户端尝试连接到Web服务时,它引发了异常:

org.jboss.ws.metadata.wsdl.WSDLException: Invalid default namespace: null
at org.jboss.ws.tools.wsdl.WSDLDefinitionsFactory.parse(WSDLDefinitionsFactory.java:134)
at org.jboss.ws.metadata.umdm.ServiceMetaData.getWsdlDefinitions(ServiceMetaData.java:293)
at org.jboss.ws.metadata.builder.jaxws.JAXWSClientMetaDataBuilder.buildMetaData(JAXWSClientMetaDataBuilder.java:84)
at org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl.<init>(ServiceDelegateImpl.java:138)
at org.jboss.ws.core.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:63)
at javax.xml.ws.Service.<init>(Service.java:79)
at org.ortelius.UssdServiceImplementation.<init>(UssdServiceImplementation.java:42)
at org.ortelius.OrteliusClient.sendUssdRequestToWs(OrteliusClient.java:28)

似乎javax.xml.ws.Service调用org.jboss.ws.core.jaxws.spi.ProviderImpl,但是它应该调用com.sun.xml.ws.spi.ProviderImpl,因此似乎与jar依赖项存在冲突。
为避免此问题,有必要:

移动或删除在$JBOSS_HOME/lib/endorsed/目录中找到的所有JBoss jar文件。
将捆绑在我的初始.war文件(失败的部署之一)中的jar复制到$JBOSS_HOME/lib/endorsed/目录。
所有打包在我的.war文件中的罐子。

基本上做到了。

最后的笔记
我不得不承认,发现这一点确实很痛苦,我花了大约四天的时间来启动并运行它。
我对jar依赖项进行了很多故障排除,检查JBoss日志,远程调试,比较Java软件包和类版本,在线搜索jar以及阅读JBoss手册,博客,StackOverflow,JavaRanch等中的许多文章。
SOAP客户端确实很简单,但是在JBoss中进行部署存在很大问题。
我的解决方案不是很正统,因为它很大程度上取决于jar文件的依赖性。
因此,我不确定它是否适用于所有人。
问候。

java.util.Scanner不返回到提示 - java

import java.util.Scanner; class newClass { public static void main(String args[]) { Scanner s = new Scanner(System.in); while (s.hasNext()) { System.out.println(s.next()); } s.clos…

java.util.HashSet是否不遵循其规范? - java

作为相对的Java noob,我很困惑地发现以下内容:Point.java:public class Point { ... public boolean equals(Point other) { return x == other.x && y == other.y; } ... } Edge.java:public class Edge…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…