Caused by: java.lang.ClassNotFoundException: com.s

2019-02-08 03:55发布

You might think that following issue is very simple, but I don't know what I did wrong here. I feel I added required dependencies. Haven't I?

Could anyone please suggest me whats wrong here?

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());
        }
    }
}

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

标签: java maven jaxb
3条回答
放我归山
2楼-- · 2019-02-08 04:00

Although Issue is very old but still answering. Root cause is that com.sun.xml.bind is obsolete now. org.glassfish.jaxb is latest reference implementation of JAXB API. Using below JAXB RI maven dependency would solve the issue.

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.2.11</version>
    </dependency>
查看更多
成全新的幸福
3楼-- · 2019-02-08 04:00

You seem to be running it inside the IDE. For some strange reasons, although the JAXB classes are included in JRE's rt.jar,

➜  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

they are not available for your app at runtime.

However, if I run the app this way:

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

i.e. from the command line using the standard Maven structure, it does seem to run.

Your book.xml is somewhat wrong, I believe. It contains an embedded person element whereas the Book.java does not. You may want to fix that.

查看更多
干净又极端
4楼-- · 2019-02-08 04:18

As per link: Why has AnnotationReader been removed from JAXB reference implementation?, you need to simply use below maven dependencies:

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

You need to refactor code a bit. Also looks like you've not created same name fields of model class, it should be like below: Person.java

@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());
        }
    }
}

The below output I see:

3
------------
Kiran
Pai
22
------------
Bill
Gates
46
------------
Steve
Jobs
40
查看更多
登录 后发表回答