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

You might think that the following problem is very simple, but I donโ€™t know what I did wrong. I feel like I added the necessary dependencies. Is not it?

Can someone please suggest me what is 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> 
+7
java maven jaxb
source share
3 answers

According to the link: Why was the AnnotationReader application removed from the JAXB reference implementation? you just need to use the 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 reorganize the code a bit. It also looks like you have not created the fields of the model class with the same name, it should look like this: 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()); } } } 

Below I see:

 3 ------------ Kiran Pai 22 ------------ Bill Gates 46 ------------ Steve Jobs 40 
+18
source share

Although the problem is very old, but still responding. The root reason is that com.sun.xml.bind is deprecated now. org.glassfish.jaxb is the latest reference implementation of the JAXB API. Using below JAXB RI maven will solve the problem.

  <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.2.11</version> </dependency> 
+5
source share

It seems you are working in an IDE. For some strange reasons, although JAXB classes are included in the rre.jar 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 

they are not available to your application at runtime.

However, if I run the application 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 works.

Your book.xml is somewhat erroneous, I believe. It contains the inline person element, but Book.java does not. You can fix it.

0
source share

All Articles