引起:java.lang.ClassNotFoundException:com.sun.xml.bind.v2.model.annotation.AnnotationReader

您可能认为以下问题非常简单,但我不知道我在这里做错了什么。 我觉得我添加了必需的依赖项。 不是吗?

有人可以建议我这里有什么不对吗?

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

我的book.xml

    Kiran Pai 22   Bill Gates 46   Steve Jobs 40   

在此处输入图像描述

的pom.xml

  UTF-8 1.8     com.sun.xml.bind jaxb-impl 2.2.11   javax.xml.bind jaxb-api 2.2.12   

根据链接: 为什么AnnotationReader已从JAXB参考实现中删除? ,您只需使用以下maven依赖项:

  com.sun.xml.bind jaxb-impl 2.2.11   com.sun.xml.bind jaxb-core 2.2.11  

你需要稍微重构一下代码。 看起来你还没有创建模型类的相同名称字段,它应该如下所示: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 = new ArrayList(); public List getPerson() { return person; } public void setPerson(List 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()); } } } 

以下输出我看到:

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

虽然问题很老但仍在回答。 根本原因是com.sun.xml.bind现在已经过时了。 org.glassfish.jaxb是JAXB API的最新参考实现。 使用下面的JAXB RI maven依赖将解决问题。

   org.glassfish.jaxb jaxb-runtime 2.2.11  

您似乎在IDE中运行它。 出于某些奇怪的原因,尽管JAX的类包含在JRE的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 

它们在运行时不适用于您的应用。

但是,如果我以这种方式运行应用程序:

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

即,从使用标准Maven结构的命令行,它似乎确实运行。

我相信你的book.xml有些不对劲。 它包含一个嵌入的person元素,而Book.java则没有。 你可能想解决这个问题。