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

问题描述 投票:0回答:8

为了测试应用程序,我正在创建 SOAP 消息。当直接从 Eclipse (Oxygen.1a) 运行时,这是有效的,但在打包为可运行的 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)

触发者:

MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

所以我明白MessageFactory使用了sun包

static private final String DEFAULT_META_FACTORY_CLASS =
    "com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl";

但是我完全不知道为什么打包到可运行的 JAR 后找不到这个类。任何提示或指示将不胜感激。

java eclipse jar saaj
8个回答
52
投票

我刚刚将以下依赖项添加到我的项目中:

<dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.5.1</version>
</dependency>                

如果您使用的版本早于 1.5.1,则需要使用以下行创建文件

META-INF/services/javax.xml.soap.SAAJMetaFactory
以提供 SAAJ 工厂类的完全限定名称,并且它有效:

com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl

javax.xml.soap.saaj-api 似乎已被放弃。 很奇怪的是,一个名为

com.sun
的包才可以工作。 无论如何,它有效。


3
投票

将我的jdk切换到11后,我遇到了同样的问题。 将 apache.cxf jar 升级到 3.5.1 解决了我的问题。正在使用 3.1.2 和 jdk 1.8


2
投票

我正在使用 Java 11,此外

implementation group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '1.5.2'

添加

implementation group: 'javax.xml.soap', name: 'javax.xml.soap-api', version: '1.4.0'

但是必须关闭

implementation group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '1.5.2'


1
投票

我通过添加以下两个依赖项解决了问题

   <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
        <version>1.5.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.soap</groupId>
        <artifactId>saaj-api</artifactId>
        <version>1.3.5</version>
    </dependency>

1
投票

我正在使用 Spring Boot 2.4.0 和 Java 11。这对我有用:

implementation 'javax.xml.ws:jaxws-api:2.3.1'
implementation 'javax.jws:javax.jws-api:1.1'
implementation 'com.sun.xml.messaging.saaj:saaj-impl:1.5.1'
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
implementation 'org.glassfish.jaxb:jaxb-runtime:2.3.2'

0
投票

上面的答案(添加 saaj-impl 和 saak-api)适用于大多数项目,但我发现如果您的项目依赖于 javax.xml webservices-api,您还需要删除该依赖项才能停止获取Java 11 中的错误。

Maven 中remove的依赖示例:

   <dependency>
     <groupId>javax.xml</groupId>
     <artifactId>webservices-api</artifactId>
     <version>2.0.1</version>
   </dependency>

0
投票

如果您使用的是 Weblogic,请更改 weblogic.xml 文件中参数

prefer-web-inf-classes
的值。 这对我有用。


0
投票

另一个让它发挥作用的答案......

我正在从 Springboot2 更改为版本 3。我包含了一个使用一些 SOAP 请求的库。为了解决这个问题,我必须包含这些two罐子:

    <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
        <version>1.5.3</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.3</version>
    </dependency>

没有

jaxb-impl
人工制品给了我一个例外:
java.lang.NoClassDefFoundError; message=com/sun/xml/bind/api/TypeReference
。我只是查了一下缺少的类包含在哪个 Jar 中。
另请参阅https://stackoverflow.com/a/45429691/845117

只是 pom versions 的设置对我有用。列出了较新的库,但它们不起作用,但会导致异常。 Houcem Berrayana 在另一条评论中提出了一个公平的问题,为什么只是这个版本确实有效,但没有更大的主要版本......

© www.soinside.com 2019 - 2024. All rights reserved.