Problema NoClassDefFoundError con Apache CXF

di il
4 risposte

Problema NoClassDefFoundError con Apache CXF

Ciao!

sto testato Apache CXF, ma riscontro sempre un problema.
questo il main:

import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;

public class Main {

    public static void main(String[] args) {
        try {
            JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
	[b]factoryBean.setResourceClasses(PersonaImpl.class);[/b]
            factoryBean.setResourceProvider(new SingletonResourceProvider(new PersonaImpl()));
            factoryBean.setAddress("http://localhost:8080/");
            Server server = factoryBean.create();
            System.out.println("Start del server");
            Thread.sleep(60 * 1000);
            System.out.println("Stop del server");
            server.destroy();
            System.exit(0);
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
    }

}
ho segnato la riga con errore:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/annotation/Resource
	at org.apache.cxf.common.injection.ResourceInjector.<clinit>(ResourceInjector.java:59)
	at org.apache.cxf.bus.extension.ExtensionManagerImpl.loadAndRegister(ExtensionManagerImpl.java:234)
	at org.apache.cxf.bus.extension.ExtensionManagerImpl.activateAllByType(ExtensionManagerImpl.java:142)
	at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:149)
	at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:155)
	at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:40)
	at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:36)
	at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:32)
	at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:107)
	at org.apache.cxf.BusFactory.createThreadBus(BusFactory.java:243)
	at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:227)
	at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:214)
	at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.getBus(JAXRSServiceFactoryBean.java:66)
	at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.createResourceInfo(JAXRSServiceFactoryBean.java:203)
	at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.setResourceClasses(JAXRSServiceFactoryBean.java:166)
	at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.setResourceClasses(JAXRSServiceFactoryBean.java:212)
	at org.apache.cxf.jaxrs.JAXRSServerFactoryBean.setResourceClasses(JAXRSServerFactoryBean.java:296)
	at com.mp.test.Main.main(Main.java:12)
Caused by: java.lang.ClassNotFoundException: javax.annotation.Resource
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 18 more
questa è la classe PersonaImpl:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import java.util.HashMap;
import java.util.Map;

@Path("persona")
@Produces("text/xml")
public class PersonaImpl {
    private Map<Integer, Persona> persone = new HashMap<>();

    {
        Persona p1 = new Persona();
        p1.setId(1);
        p1.setNome("Matteo");

        Persona p2 = new Persona();
        p2.setId(2);
        p2.setNome("Andrea");

        persone.put(1, p1);
        persone.put(2, p2);
    }

    @GET
    @Path("persone/{pId}")
    public Persona getPersona(@PathParam("pId") int pId) {
        return findById(pId);
    }

    private Persona findById(int id) {
        for (Map.Entry<Integer, Persona> map : persone.entrySet()) {
            if (map.getKey() == id) {
                return map.getValue();
            }
        }
        return null;
    }
}
qulche idea??

4 Risposte

  • Re: Problema NoClassDefFoundError con Apache CXF

    fermat ha scritto:


    Exception in thread "main" java.lang.NoClassDefFoundError: javax/annotation/Resource
    Presumo che stai usando almeno un JDK 11 o superiore. In Java SE 11 purtroppo il package delle Commons Annotation (javax.annotation) è stato rimosso dal framework.

    Soluzioni:
    - usare una versione inferiore di Java (se possibile, chiaramente)
    - puoi prendere la API javax.annotation dal Maven Central: (se usi Maven come build tool ok, altrimenti puoi anche solo prendere il jar "a mano")
  • Re: Problema NoClassDefFoundError con Apache CXF

    Ciao andbin!

    grazie, ho risolto aggiungendo la dipendenza al pom.xml:
    
     <dependency>
                <groupId>javax.annotation</groupId>
                <artifactId>javax.annotation-api</artifactId>
                <version>1.3.2</version>
            </dependency>
    
    non sto capendo molto bene le operazioni che stanno facendo sulle ultime versioni.
    c'è un pò di casino...

    cmq grazie!
  • Re: Problema NoClassDefFoundError con Apache CXF

    fermat ha scritto:


    non sto capendo molto bene le operazioni che stanno facendo sulle ultime versioni.
    c'è un pò di casino...
    A parte la nuova modularizzazione introdotta in Java 9, stanno anche cercando di rimuovere cose "obsolete", interne/non-standard, poco coerenti, ecc...
    Basta guardare le recenti release note di rimozione (es. quella del JDK 9) per rendersi conto di quello che stanno man mano togliendo ..
  • Re: Problema NoClassDefFoundError con Apache CXF

    Si ma quello che non capisco è che se tanto poi devo aggiungere mille librerie esterne, non vale la pena lasciarle???
    nel caso specifico, ad esempio, le annotazioni mi sembra vengano usate in tantissime librerie

    ovviamente parlo da ignorante, sicuramente hanno i loro buoni motivi.
Devi accedere o registrarti per scrivere nel forum
4 risposte