1

Just to repoduce the issue I generated new project using Spring Initializr and I added jax-ws dependencies to pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>jaxws-spring-boot-java11</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>jaxws-spring-boot-java11</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.4.0-b180830.0438</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.3.1</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>rt</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <configuration>
                    <finalName>app</finalName>
                </configuration>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

And here is the main class:

@SpringBootApplication
public class JaxwsSpringBootJava11Application implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(JaxwsSpringBootJava11Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        Class<?> clazz = Class.forName("com.sun.xml.ws.api.server.SDDocumentSource");
        System.out.println(clazz);
    }
}

It works fine if run it with IntelliJ IDEA or mvn spring-boot:run. But it fails if build an executable jar with maven and run it:

mvn clean package
java -jar target/app.jar

I tried to do same with maven-assembly-plugin and it works. Maven version is 3.6.0. Here is the demo project to download: https://mega.nz/#!a9R1nQrS!RAhDKCYxiKNoy3TSazH-Jzak1k4b61EYaFAVEvYxFmY Here is logout:

java.lang.NoClassDefFoundError: com/sun/xml/ws/api/server/SDDocumentSource$3
        at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
        at java.base/java.lang.Class.forName(Class.java:315) ~[na:na]
        at com.example.jaxwsspringbootjava11.JaxwsSpringBootJava11Application.run(JaxwsSpringBootJava11Application.java:16) ~[classes!/:0.0.1-SNAPSHOT]
        at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:813) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
        at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:797) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:324) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]
        at com.example.jaxwsspringbootjava11.JaxwsSpringBootJava11Application.main(JaxwsSpringBootJava11Application.java:11) ~[classes!/:0.0.1-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[app.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[app.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) ~[app.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) ~[app.jar:0.0.1-SNAPSHOT]
Caused by: java.lang.ClassNotFoundException: com.sun.xml.ws.api.server.SDDocumentSource$3
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[na:na]
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93) ~[app.jar:0.0.1-SNAPSHOT]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
        ... 17 common frames omitted
Ihor Rybak
  • 3,091
  • 2
  • 25
  • 32
  • What is the logout if it fails? – khmarbaise Mar 24 '19 at 20:41
  • @khmarbaise ok logout is added – Ihor Rybak Mar 24 '19 at 21:17
  • I would try to list contents of the jar just to see if class is in or not, try `jar tf target/app.jar`. If you see class is listed then check if it is in class-path at correct location as you are accessing it since boot-jar has different packaging structure than usual. `--debug` option print boot app class-path. – ravinikam Mar 25 '19 at 00:45
  • @ravinikam ok I have run `jar tf target/app.jar` and its output contains `BOOT-INF/lib/rt-2.3.1.jar` (but not jaxws-rt or required class) then I extracted `rt-2.3.1.jar` and run `jar tf rt-2.3.1.jar | grep 'SDDocumentSource' ` and it contains line `com/sun/xml/ws/api/server/SDDocumentSource.class` so it is supposed to be present in the classpath. – Ihor Rybak Mar 25 '19 at 10:31

0 Answers0