web-dev-qa-db-fra.com

Causée par: Java.lang.ClassNotFoundException: com.Sun.xml.bind.v2.model.annotation.AnnotationReader

Vous pourriez penser que le problème suivant est très simple, mais je ne sais pas ce que j'ai mal fait ici. Je pense que j'ai ajouté les dépendances requises. N'est-ce pas?

Quelqu'un pourrait-il me dire s'il vous plaît ce qui ne va pas ici?

Exception in thread "main" Java.lang.NoClassDefFoundError: com/Sun/xml/bind/v2/model/annotation/AnnotationReader
    at Java.lang.ClassLoader.defineClass1(Native Method)
    at Java.lang.ClassLoader.defineClass(ClassLoader.Java:760)
    at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:142)
    at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:467)
    at Java.net.URLClassLoader.access$100(URLClassLoader.Java:73)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:368)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:362)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:361)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:331)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
    at Java.lang.Class.getDeclaredMethods0(Native Method)
    at Java.lang.Class.privateGetDeclaredMethods(Class.Java:2701)
    at Java.lang.Class.privateGetMethodRecursive(Class.Java:3048)
    at Java.lang.Class.getMethod0(Class.Java:3018)
    at Java.lang.Class.getMethod(Class.Java:1784)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.Java:242)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.Java:234)
    at javax.xml.bind.ContextFinder.find(ContextFinder.Java:441)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.Java:641)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.Java:584)
    at com.misc.common.ReadXMLFileJaxb.main(ReadXMLFileJaxb.Java:14)
Caused by: Java.lang.ClassNotFoundException: com.Sun.xml.bind.v2.model.annotation.AnnotationReader
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:381)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:331)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
    ... 23 more

Book.Java

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
    @XmlAttribute
    private String firstName;
    @XmlElement
    private String lastName;
    @XmlElement
    private String age;


    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Book [firstName=" + firstName + ", lastName=" + lastName+ ", age=" + age + "]";
    }
}

ReadXMLFileJaxb.Java

public class ReadXMLFileJaxb {
    public static void main(String[] args) {
        File file = new File(ReadXMLFileDOM.class.getClassLoader().getResource("book.xml").getFile());

        try {
            JAXBContext context = JAXBContext.newInstance(Book.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Book book = (Book) unmarshaller.unmarshal(file);
            System.out.println(book.toString());
        } catch (JAXBException e) {
            System.out.println(e.getMessage());
        }
    }
}

Mon book.xml

<?xml version="1.0"?>
<book>
    <person>
        <first>Kiran</first>
        <last>Pai</last>
        <age>22</age>
    </person>
    <person>
        <first>Bill</first>
        <last>Gates</last>
        <age>46</age>
    </person>
    <person>
        <first>Steve</first>
        <last>Jobs</last>
        <age>40</age>
    </person>
</book>

 enter image description here

pom.xml

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <Java.version>1.8</Java.version>
    </properties>

    <dependencies>
        <!-- JAXB -->
        <dependency>
            <groupId>com.Sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.12</version>
        </dependency>
    </dependencies>
17
user4821194

Voir lien: Pourquoi AnnotationReader a-t-il été supprimé de la mise en œuvre de référence JAXB? , vous devez simplement utiliser les dépendances ci-dessous:

<dependency>
    <groupId>com.Sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.11</version>
</dependency>

<dependency>
    <groupId>com.Sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.2.11</version>
</dependency>

Vous avez besoin de refactoriser un peu le code. On dirait aussi que vous n’avez pas créé les mêmes champs de nom que la classe de modèle, cela devrait être comme ci-dessous:

@XmlRootElement(name="Person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
    @XmlElement
    private String first;
    @XmlElement
    private String last;
    @XmlElement
    private String age;
    public String getFirst() {
        return first;
    }
    public void setFirst(String first) {
        this.first = first;
    }
    public String getLast() {
        return last;
    }
    public void setLast(String last) {
        this.last = last;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [first=" + first + ", last=" + last + ", age=" + age + "]";
    }
} 

Book.Java

@XmlRootElement(name="book")
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
    private List<Person> person = new ArrayList<Person>();

    public List<Person> getPerson() {
        return person;
    }

    public void setPerson(List<Person> person) {
        this.person = person;
    }
}

ReadXMLFileJaxb.Java

public class ReadXMLFileJaxb {
    public static void main(String[] args) {
        File file = new File(ReadXMLFileDOM.class.getClassLoader().getResource("book.xml").getFile());

        try {
            JAXBContext context = JAXBContext.newInstance(Book.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Book book = (Book) unmarshaller.unmarshal(file);
            System.out.println(book.getPerson().size());

            for (int i = 0; i < book.getPerson().size(); i++) {
                System.out.println("------------");
                System.out.println(book.getPerson().get(i).getFirst());
                System.out.println(book.getPerson().get(i).getLast());
                System.out.println(book.getPerson().get(i).getAge());
            }

        } catch (JAXBException e) {
            System.out.println(e.getMessage());
        }
    }
}

La sortie ci-dessous, je vois:

3
------------
Kiran
Pai
22
------------
Bill
Gates
46
------------
Steve
Jobs
40
41
user4821194

Bien que Issue soit très ancien mais toujours en train de répondre. La cause première est que com.Sun.xml.bind est obsolète maintenant. org.glassfish.jaxb est la dernière implémentation de référence de l'API JAXB. Utiliser ci-dessous la dépendance de maven JAXB RI résoudrait le problème.

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.2.11</version>
    </dependency>
11
nirmalsingh

Vous semblez l'exécuter dans l'IDE. Pour des raisons étranges, bien que les classes JAXB soient incluses dans le fichier rt.jar de JRE,

➜  lib jar tvf rt.jar| grep AnnotationReader
  4199 Fri Jan 29 15:35:18 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/AbstractInlineAnnotationReaderImpl.class
  3140 Fri Jan 29 15:35:14 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/AnnotationReader.class
   442 Fri Jan 29 15:35:14 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/RuntimeAnnotationReader.class
  9846 Fri Jan 29 15:35:22 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/RuntimeInlineAnnotationReader.class
  1217 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$1.class
  1332 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$2.class
  1278 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$3.class
  1166 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$4.class
  3563 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader.class

ils ne sont pas disponibles pour votre application au moment de l'exécution. 

Cependant, si je lance l'application de cette façon:

➜  target Java -cp ./classes com.misc.common.ReadXMLFileJaxb
Book [firstName=null, lastName=Blo, age=33]

c’est-à-dire qu’à partir de la ligne de commande utilisant la structure Maven standard, il semble fonctionner.

Votre book.xml est un peu faux, je crois. Il contient un élément person incorporé, contrairement à Book.Java. Vous voudrez peut-être résoudre ce problème.

0
Kedar Mhaswade