简体   繁体   English

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

[英]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.

相关问题 生成 GUI 源时未找到 Class java.lang.NoClassDefFoundError: com/sun/xml/bind/v2/model/annotation/AnnotationReader [Codenameone] - Class not found while generating the GUI sources java.lang.NoClassDefFoundError: com/sun/xml/bind/v2/model/annotation/AnnotationReader [Codenameone] java.lang.ClassNotFoundException:com.sun.xml.internal.bind.v2.ContextFactory - java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory javax.xml.bind.JAXBException [java.lang.ClassNotFoundException: com.sun.xmldk.bind.52Factory] - javax.xml.bind.JAXBException [java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory] in jdk1.5 CXF JSONProvider编组导致java.lang.ClassNotFoundException:com.sun.xml.bind.marshaller.NamespacePrefixMapper - CXF JSONProvider marshalling causes java.lang.ClassNotFoundException: com.sun.xml.bind.marshaller.NamespacePrefixMapper java.lang.ClassNotFoundException:com.sun.xml.wss.XWSSecurityException - java.lang.ClassNotFoundException: com.sun.xml.wss.XWSSecurityException java.lang.ClassNotFoundException: com.sun.org.apache.xml.internal.resolver.CatalogManager Java 11 - java.lang.ClassNotFoundException: com.sun.org.apache.xml.internal.resolver.CatalogManager Java 11 java.lang.NoSuchMethodException:com.sun.xml.bind.v2.model.nav.ReflectionNavigator.getInstance() - java.lang.NoSuchMethodException: com.sun.xml.bind.v2.model.nav.ReflectionNavigator.getInstance() 获取 java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl 尽管定义了依赖项 - Getting java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl despite the dependencies are defined java.lang.ClassNotFoundException:com.sun.mail.util.MessageRemovedIOException - java.lang.ClassNotFoundException: com.sun.mail.util.MessageRemovedIOException java.lang.ClassNotFoundException:com.sun.faces.config.ConfigureListener - java.lang.ClassNotFoundException: com.sun.faces.config.ConfigureListener
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM