2016-04-11 21 views
7

Bạn có thể nghĩ rằng vấn đề sau đây rất đơn giản, nhưng tôi không biết mình đã làm gì sai ở đây. Tôi cảm thấy tôi đã thêm các phụ thuộc bắt buộc. Phải không?Gây ra bởi: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.model.annotation.AnnotationReader

Có ai vui lòng đề xuất cho tôi điều gì sai ở đây không?

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 My

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

Trả lời

18

Theo link: Why has AnnotationReader been removed from JAXB reference implementation?, bạn cần phải chỉ cần sử dụng dưới đây phụ thuộc maven:

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

Bạn cần phải refactor code một chút. Cũng có vẻ như bạn đã không tạo ra các lĩnh vực cùng tên của lớp mô hình, nó phải là như dưới đây: 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()); 
     } 
    } 
} 

Sản lượng dưới đây tôi thấy:

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

Có vẻ như bạn đang chạy nó bên trong IDE. Vì một số lý do lạ, mặc dù các lớp JAXB được bao gồm trong rt.jar của 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 

chúng không khả dụng cho ứng dụng của bạn trong thời gian chạy.

Tuy nhiên, nếu tôi chạy ứng dụng theo cách này:

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

ví dụ: từ dòng lệnh bằng cách sử dụng cấu trúc Maven tiêu chuẩn, nó dường như để chạy.

Book.xml của bạn có phần sai, tôi tin. Nó chứa phần tử person được nhúng trong khi Book.java thì không. Bạn có thể muốn sửa lỗi đó.

4

Mặc dù vấn đề rất cũ nhưng vẫn trả lời. Nguyên nhân gốc rễ là com.sun.xml.bind đã lỗi thời. org.glassfish.jaxb là triển khai tham chiếu mới nhất của API JAXB. Việc sử dụng phụ thuộc Maven dưới JAXB RI sẽ giải quyết vấn đề.

<dependency> 
     <groupId>org.glassfish.jaxb</groupId> 
     <artifactId>jaxb-runtime</artifactId> 
     <version>2.2.11</version> 
    </dependency> 
+0

tôi nghĩ đây là trường hợp và tôi đã thêm nó và vẫn gặp sự cố – GSUgambit

+0

tôi phải chuyển sang 2.3.0 tạo phẩm thời gian chạy và lõi để khắc phục sự cố – GSUgambit

Các vấn đề liên quan