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

jrcvhitl  于 2023-10-18  发布在  Eclipse
关注(0)|答案(8)|浏览(173)

为了测试应用程序,我创建了SOAP消息。这在直接从Eclipse(Oxygen.1a)运行时有效,但在打包为可运行的jar(选项:package required libraries into generated 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";

但我绝对不知道为什么它是无法找到这个类后, Package 到一个可运行的插件。任何提示或方向将大大appreciated。

cgvd09ve

cgvd09ve1#

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

<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的软件包是可以工作的。不管怎么说,它起作用了。

agyaoht7

agyaoht72#

当我把jdk换成11的时候,我也遇到了同样的问题。将apache.cxf jar升级到3.5.1解决了我的问题。

kyxcudwk

kyxcudwk3#

我使用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'

2uluyalo

2uluyalo4#

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

<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>
ezykj2lf

ezykj2lf5#

Sping 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'
uajslkp6

uajslkp66#

上面的答案(添加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>
h4cxqtbf

h4cxqtbf7#

如果您使用的是Weblogic,请在weblogic.xml文件中更改参数prefer-web-inf-classes的值。对我很有效。

im9ewurl

im9ewurl8#

另一个让它工作的答案是...
我正在从Springboot 2更改到版本3。我包含了一个库,它通过/在外部交付的Jar中使用一些SOAP请求。
为了解决这个问题,我必须包括这两个**jar:

<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在另一个评论,为什么只是 * 这个版本 * 不工作,但没有更大的主要之一.

相关问题