在打包为JAR后无法创建SAAJ元工厂

Hak*_*llo 9 java eclipse jar saaj

为了测试应用程序,我正在创建SOAP消息.这可以直接从Eclipse(Oxygen.1a)运行,但在打包为runnable jar(选项:将所需的包打包到生成的jar中)后,我收到以下错误:

javax.xml.soap.SOAPException: Unable to create SAAJ meta-factoryProvider com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl not found
    at javax.xml.soap.SAAJMetaFactory.getInstance(SAAJMetaFactory.java:94)
    at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:138)
Run Code Online (Sandbox Code Playgroud)

触发:

MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
Run Code Online (Sandbox Code Playgroud)

所以我理解MessageFactory使用sun包

static private final String DEFAULT_META_FACTORY_CLASS =
    "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl";
Run Code Online (Sandbox Code Playgroud)

但是我绝对无能为力地知道为什么它在打包到可运行的JAR之后无法找到这个类.任何提示或方向都会大大减少.

Man*_*pos 16

我在项目中添加了以下依赖项:

<dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.5.0</version>
</dependency>                
Run Code Online (Sandbox Code Playgroud)

然后我META-INF/services/javax.xml.soap.SAAJMetaFactory使用以下行创建了该文件,以提供SAAS工厂类的完全限定名称,并且它有效:

com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl
Run Code Online (Sandbox Code Playgroud)

javax.xml.soap.saaj-API似乎被弃用.

  • 我测试了这个,从Java 8移植到JDK 11.它解决了问题,在Tomcat 9中运行 (6认同)
  • 我和@mico 的情况类似,从 1.6 升级到 11,从 Tomcat 7/GlassFish 3 升级到 Tomcat9。这个答案几乎对我有用,但我一直收到 `org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR` 异常。当我将 `saaj-impl` 降级到版本 `1.3` 时,问题就消失了。见[这个答案](/sf/ask/222898791/) (2认同)
  • 请注意,如果更新到 jar 的 1.5.1 版本,则不需要创建 META-INF/services/javax.xml.soap.SAAJMetaFactory 文件 (2认同)