Unable to create SAAJ meta-factory after packaging as JAR

Viewed 41104

For testing an application I am creating SOAP messages. This works when run directly from Eclipse (Oxygen.1a) but after packaging as runnable jar (option: package required libraries into generated jar) I get the following error:

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)

triggered by:

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

So I understand that the MessageFactory uses a sun package

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

But I am absolutly clueless as to why it is unable to find this class after packaging to a runnable JAR. Any hints or directions would be greatly apreciated.

7 Answers

I just added the following dependency to my project:

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

If you are using a version older than 1.5.1, you need to create the file META-INF/services/javax.xml.soap.SAAJMetaFactory with the following line to provide the fully-qualified name of the SAAJ factory class and it worked:

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

The javax.xml.soap.saaj-api seems to be abandoned. And it's very strange that a package named com.sun is the one to work. Anyway, it works.

I'm using Java 11 and in addition to the

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

add

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

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

After switching my jdk to 11,I had same problem. Uppgrading apache.cxf jar to 3.5.1 solved my problem.Was using 3.1.2 with jdk 1.8

I have solved the problem by adding the following two dependencies

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

I'm using Spring Boot 2.4.0 and Java 11. This is what worked for me:

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'

The answers above (adding saaj-impl and saak-api) work for most projects, but I found out that if your project has a dependency on javax.xml webservices-api, you also need to remove that dependency in order to stop getting that error in Java 11.

Exemple of the dependency to remove in Maven :

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

If you are using Weblogic, change the value of the parameter prefer-web-inf-classes at weblogic.xml file. It worked for me.

Related