[英]Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.model.annotation.AnnotationReader
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书.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读取XMLFileJaxb.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
<?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>
pom.xml 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>
As per link: Why has AnnotationReader been removed from JAXB reference implementation?根据链接: 为什么从 JAXB 参考实现中删除了 AnnotationReader? , you need to simply use below maven dependencies:
,您只需使用以下 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>
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
看起来您还没有创建模型类的同名字段,它应该如下所示: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书.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读取XMLFileJaxb.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
Although Issue is very old but still answering.虽然问题很老但仍在回答。 Root cause is that com.sun.xml.bind is obsolete now.
根本原因是 com.sun.xml.bind 现在已过时。 org.glassfish.jaxb is latest reference implementation of JAXB API.
org.glassfish.jaxb 是 JAXB API 的最新参考实现。 Using below JAXB RI maven dependency would solve the issue.
使用下面的 JAXB RI maven 依赖可以解决这个问题。
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.2.11</version>
</dependency>
The best solution that I found is using maven-jaxb2-plugin, then the only dependency that you need is:我发现的最佳解决方案是使用 maven-jaxb2-plugin,那么您需要的唯一依赖项是:
<!-- https://mvnrepository.com/artifact/org.jvnet.jaxb2.maven2/maven-jaxb2-plugin -->
<dependency>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
</dependency>
You seem to be running it inside the IDE.您似乎在 IDE 中运行它。 For some strange reasons, although the JAXB classes are included in JRE's rt.jar,
出于一些奇怪的原因,虽然 JAXB 类包含在 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
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]
ie from the command line using the standard Maven structure, it does seem to run.即从使用标准 Maven 结构的命令行,它似乎运行。
Your book.xml is somewhat wrong, I believe.我相信你的 book.xml 有点错误。 It contains an embedded
person
element whereas the Book.java does not.它包含一个嵌入的
person
元素,而 Book.java 没有。 You may want to fix that.你可能想解决这个问题。
Solve the error by adding these two dependencies in pom通过在pom中添加这两个依赖解决错误
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.