JAX-WS unter Java 17 plötzlich nicht mehr möglich

Maliko

Bekanntes Mitglied
Moin,

ich hab hier grad ein ziemlich großes Problem. Und zwar haben wir bei uns nach vielen Jahren ein Update von Java 8 auf Java 17 gemacht. Hat auch wunderbar funktioniert bisher. Jedoch funktioniert ein Projekt jetzt nicht mehr. Und zwar ein Projekt das JAX-WS nutzt. Als ich das Projekt umgestellt habe, bekam ich Fehlermeldungen dass er den javax.jws-Namespace nicht mehr finden kann. Dies habe ich allerdings dadurch behoben, indem ich die Bibliothek JAX-WS 2.3.5 eingebunden habe. Danach konnte ich das Projekt kompilieren und auch starten. Doch sobald ich versuche den Server zu starten, bekomme ich folgende Fehlermeldung wenn ich versuche die Funktion "this.endpoint.publish(context);" auszuführen:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/annotation/Resource
at com.sun.xml.ws.util.InjectionPlan.buildInjectionPlan(InjectionPlan.java:159)
at com.sun.xml.ws.server.DefaultResourceInjector.inject(DefaultResourceInjector.java:28)
at com.sun.xml.ws.server.SingletonResolver.start(SingletonResolver.java:40)
at com.sun.xml.ws.api.server.InstanceResolver$1.start(InstanceResolver.java:208)
at com.sun.xml.ws.server.InvokerTube.setEndpoint(InvokerTube.java:53)
at com.sun.xml.ws.server.WSEndpointImpl.<init>(WSEndpointImpl.java:174)
at com.sun.xml.ws.server.EndpointFactory.create(EndpointFactory.java:307)
at com.sun.xml.ws.server.EndpointFactory.create(EndpointFactory.java:302)
at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:134)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:578)
at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:560)
at com.sun.xml.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:304)
at com.sun.xml.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:227)
at asekvwebservice.Webserver.Webserver.initWebserver(Webserver.java:107)
at asekvwebservice.Launcher.Launcher.startWebserver(Launcher.java:147)
at asekvwebservice.Launcher.Launcher.btnStartMouseClicked(Launcher.java:140)
at asekvwebservice.Launcher.Launcher.access$000(Launcher.java:27)
at asekvwebservice.Launcher.Launcher$1.mouseClicked(Launcher.java:82)
at java.desktop/java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:278)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6629)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3389)
at java.desktop/java.awt.Component.processEvent(Component.java:6391)
at java.desktop/java.awt.Container.processEvent(Container.java:2266)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4584)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:746)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.annotation.Resource
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
... 49 more
Alles was ich dazu gefunden habe, hängt irgendwie mit Maven zusammen. Wir benutzen allerdings Java-Ant. Kann mir vielleicht irgendjemand von euch weiterhelfen, wie ich diesen Fehler los werde? Weil unter Java 8 lief das ganze ohne Probleme. Es muss also mit dem Update auf Java 17 zusammenhängen.

Vielen Dank schon einmal im Voraus.

Viele Grüße
Maliko

Falls benötigt hier auch noch mal der Code des Servers:
Java:
/**
 *
 * @author ASEKV
 */
public class Webserver {
    private Endpoint endpoint;
    private HttpsServer server;
   
    public void initWebserver() throws ASEKVException, UnknownHostException, FileNotFoundException, IOException, NoSuchAlgorithmException, KeyStoreException, CertificateException, UnrecoverableKeyException, KeyManagementException {
        ExecutorService executor = Executors.newFixedThreadPool(20);
       
        this.endpoint = Endpoint.create(new ASEKVServiceImpl());
        InetSocketAddress address;
        char[] password;
        FileInputStream input;
       
        if(!GlobalProperties.isLocal()) {
            if(!GlobalProperties.isDebug()) {
                address = new InetSocketAddress(InetAddress.getByName("domain.de"), 5642);
                password = "hallo123".toCharArray();
                input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\prod.jks");
            } else {
                address = new InetSocketAddress(InetAddress.getByName("domain.de"), 5643);
                password = "hallo123".toCharArray();
                input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\prod.jks");
            }
        } else {
            if(!GlobalProperties.isDebug()) {
                address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 5642);
            password = "123456".toCharArray();
            input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\localhost.jks");
            } else {
                address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 5643);
                password = "123456".toCharArray();
                input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\localhost.jks");
            }
        }
       
        this.server = HttpsServer.create(address, 0);
        SSLContext ssl = SSLContext.getInstance("TLSv1.2");
       
        KeyStore store = KeyStore.getInstance("JKS");
        store.load(input, password);
       
        KeyManagerFactory keyManager = KeyManagerFactory.getInstance("SunX509");
        keyManager.init(store, password);
       
        TrustManagerFactory trustManager = TrustManagerFactory.getInstance("SunX509");
        trustManager.init(store);
     
        ssl.init(keyManager.getKeyManagers(), trustManager.getTrustManagers(), null);
       
        this.server.setHttpsConfigurator(new HttpsConfigurator(ssl) {
            @Override
            public void configure(HttpsParameters params) {
                try {
                    SSLContext context = SSLContext.getDefault();
                    SSLEngine engine = context.createSSLEngine();
                    params.setNeedClientAuth(false);
                    params.setCipherSuites(engine.getEnabledCipherSuites());
                    params.setProtocols(engine.getEnabledProtocols());
                    params.setSSLParameters(context.getDefaultSSLParameters());
                } catch (NoSuchAlgorithmException e) {
                    System.out.println(e.getMessage());
                }
            }
        });
       
        this.server.start();
       
        HttpContext context = server.createContext("/asekv");
        this.endpoint.setExecutor(executor);
        this.endpoint.publish(context);
    }
   
    public void stopWebserver() {
        this.endpoint.stop();
        this.server.stop(0);
       
        this.server = null;
        this.endpoint = null;
    }
}
 
Habt ihr auch gleichzeitig die Sache modularisiert (also ein module-info.java angelegt im Projekt?

Aber ich glaube javax.annotation.resource gibt es nicht mehr direkt in der JDK, das muesste jetzt eine Jakarta Abhaengigkeit sein (jakarta.anootation.resource?).
 
Schau mal hier: https://blogs.oracle.com/javamagazi...plications-to-java-17-heres-why-and-heres-how
Please note that both JAXB and JAX-WS require two dependencies: one for the API and one for the implementation. Another change is the naming convention now that Java EE is maintained by the Eclipse Foundation under the name Jakarta EE. Your package imports need to reflect this change, so for instance jakarta.xml.bind.* should be used instead of javax.xml.bind.*.

Ergänzung:
Ich würde mal alle Dependencys durchgehen und schauen ob die Java 11/17 Ready sind oder angehoben werden müssen.
 
Zuletzt bearbeitet:
Es war tatsächlich eine Fehlende Abhängigkeit. Wir haben jetzt die javax.annotation.jar aus dem zentralen Mavenrepository runtergeladen und per Hand dem Projekt hinzugefügt. Damit ist das Problem gelöst. Scheinbar befindet sich die Klasse nicht in der Library JAX-WS 2.3.5.
 
Wir haben jetzt ein ganz merkwürdiges Problem. Und zwar haben wir einen externen Partner, der den SOAP-Webservice über einen PHP-Client nutzt um den es hier ging und vor der Umstellung auf Java 17 hat deren Client auch einwandfrei funktioniert. Doch jetzt nach der Umstellung auf Java 17 kann der Client plötzlich nicht mehr mit der Schnittstelle kommunizieren. Beim Aufruf bekommt er jetzt immer die folgende Fehlermeldung:

Parsing WSDL: Couldn't load from 'https://localhost:5643/asekv?wsdl' : failed to load external entity "https://localhost:5643/asekv?wsdl

Wir haben den Client vom Partner bekommen und haben es lokal getestet und können es nachstellen. Wenn die Schnittstelle mit Java 8 Kompiliert wird, dann funktioniert der Zugriff, kompilieren wir mit Java 17, dann kommt oben genannter Fehler.

Hat vielleicht irgendjamand von euch eine Ahnung woran das liegen könnte? Ich habe auch bereits versucht über einen C#-Client zuzugreifen und dort hat es funktioniert. Es scheint von der Problematik ausschließlich der PHP-Client betroffen zu sein. Gibt es zwischen Java 8 und Java 17 vielleicht im JAX-WS irgendeinen Unterschied, der uns hier jetzt auf die Füße fällt?

Ich bin langsam nämlich echt Ratlos.

Viele Grüße
Maliko
 
ich würde mal die WSDL unter der URL aufmachen und dann - sofern verlinkt - alle referenzierten XSDs aufmachen.

Meine Vermutung ist, dass irgendeiner dieser Aufrufe in Java 8 klappt, in Java 17 aber nicht mehr. Vermutlich ruft PHP Dinge ab aus der WSDL, die C# ignoriert. Ggf. auch mal im Server wirklich ins access.log schauen, welche URLs exakt angesprochen werden.

Ansonsten die WSDL (ist die automatisch erzeugt oder deployed) mit Java 8 und Java 17 Stand abrufen und im Texteditor vergleichen ob es Unterschiede sind.
 

Zurück
Oben