当前位置: 首页 > 知识库问答 >
问题:

JAXB在Java 7下出现问题,它说找不到RI 2.1.0

宰父跃
2023-03-14

我正在使用OracleJava7 Update 3在Ubuntu上运行测试。根据发行说明,它包含JAXB-2.2.4。

/home/ubuntu# update-alternatives --config java
There is only one alternative in link group java: /usr/lib/jvm/java-7-oracle/bin/java
Nothing to configure.

机器说上面有JAXB-2.2.4:

$ wsimport -version
JAX-WS RI 2.2.4-b01

$ java -版本

java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode)

然而,当我运行使用JAX-RS并使用JAXB编组某些对象的应用程序时,我得到以下错误:

Apr 05, 2012 10:45:50 AM com.sun.jersey.api.json.JSONConfiguration natural
SEVERE: NATURAL JSON notation configured, but JAXB RI 2.1.10 not found. For the
recent builds to get this working correctly, you need even at least JAXB version
 2.1.12. Please add it to your classpath!
Apr 05, 2012 10:45:50 AM com.sun.jersey.core.spi.component.ProviderFactory __get
ComponentProvider
SEVERE: The provider class, class com.marketchorus.rest.config.JAXBContextResolv
er, could not be instantiated. Processing will continue but the class will not b
e utilized
java.lang.RuntimeException: NATURAL JSON notation configured, but JAXB RI 2.1.10
 not found. For the recent builds to get this working correctly, you need even a
t least JAXB version 2.1.12. Please add it to your classpath!

在服务器端,我最初也遇到了同样的错误,所以我将metro-2.2-standalone安装到tomcat中,修复了这个问题。(即使它运行在java 7中)。

在windows客户端上,我被迫将JAXB-2.2.5 api、impl和jsr173 jars添加到我认可的java目录中,以使其正常工作(也有Java7更新3)。

当我尝试在ubuntu下执行jaxb技巧时,我将文件放在/usr/lib/jvm/java-7-oracle/jre/lib/endorred下,得到了一个不同的错误:

ERROR 10:55:44.694 taskScheduler-1 org.springframework.scheduling.support.TaskUt
ils$LoggingErrorHandler - Unexpected error occurred in scheduled task.
javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.MXParser
Factory not found

我正在我的类中初始化JAX-RS/JAXB代码,如下所示:

config = new DefaultClientConfig();
config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
config.getClasses().add(JAXBContextResolver.class);
client = Client.create(config);
service = client.resource(UriBuilder.fromUri(proc.getUrl()).build());

我试着用source=1.7和target=1.7编译它,因为它仍然设置为1.6,我想它可能是假设了早期1.6版本的旧版本,它太旧了,但也不能解决问题。

我运行了@andih的测试程序,仍然得到错误。我开始认为这是一个虚拟机问题:

ubuntu@ip-10-202-155-29:~/test$ java -cp jersey-client-1.12.jar:jersey-core-1.1
2.jar:jersery-fastinfoset-1.12.jar:jersey-json-1.12.jar:. TestNaturalJson
Apr 23, 2012 10:17:21 AM com.sun.jersey.api.json.JSONConfiguration natural
SEVERE: NATURAL JSON notation configured, but JAXB RI 2.1.10 not found. For the
recent builds to get this working correctly, you need even at least JAXB version
 2.1.12. Please add it to your classpath!
Exception in thread "main" java.lang.RuntimeException: NATURAL JSON notation con
figured, but JAXB RI 2.1.10 not found. For the recent builds to get this working
 correctly, you need even at least JAXB version 2.1.12. Please add it to your cl
asspath!
        at com.sun.jersey.api.json.JSONConfiguration.natural(JSONConfiguration.j
ava:447)
        at TestNaturalJson.main(TestNaturalJson.java:6)
ubuntu@ip-10-202-155-29:~/test$ java -version
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode)

回顾使用JAXB-2.2.5 RI认可的解决方案,我安装了这些文件:

jaxb-api.jar
jaxb-impl.jar
jsr173_1.0_api.jar

到:

/usr/lib/jvm/java-7-oracle/jre/lib/endorsed

目录当我这样做的时候,我从Spring得到了上面的错误MXParser错误。这里的wierd是在windows下工作的,但在Ubuntu上不行。当我用认可的设置运行@andhi下面的测试程序时,我得到了OK,而不是错误。但由于某些原因,Ubuntu下的Spring似乎没有获取安装在认可目录(即STAX实现)中的JSR173 jar文件。

共有3个答案

鲜于岳
2023-03-14

我很感谢这里的所有评论,但没有人能解决我的问题,所以我按以下方式处理。我将Metro-2.2安装到Tomcat 7中。然后,由于我的应用程序是一个Spring命令行应用程序,所以我用它构建了一个war,以便它可以在Tomcat容器中运行。这涉及到将我的应用程序的所有库放在WEB-INF/lib中,我的配置文件放在WEB-INF/classes中。在WEB-INF目录中,我放置了一个WEB。如下所示的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd">
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/classes/remote-scheduler-spring-config.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>
</web-app>

index.jsp是空的,因为这个应用程序没有面向Web的组件。sping-config参数是我的顶级Spring配置文件,可以从命令行加载。然后我的ant build在这个应用程序上构建了一场战争,它运行得很好。所以仍然不知道为什么我在jvm中认可的文件没有起作用,因为按照建议使用详细:类标志显示它们正在加载,但是通过使用tomcat作为容器并在那里加载我需要的类,泽西很高兴,所有问题都消失了。再次感谢在这个问题上的所有帮助。

融宏伟
2023-03-14

要知道一个类是从哪里装入的,应该运行带有< code>-verbose:class选项的JVM命令行。

这样,您就可以在抛出< code > javax . XML . stream . factoryconfigurationerror 异常之前,或者在出现诊断消息< code > JAXB RI 2 . 1 . 10 not found 之前,通过查看最新的详细行来猜测出了什么问题。

因此,您可以获取实现来自的jar并检查认可的目录是否被使用…

劳华灿
2023-03-14

在我看来,这是一个类路径问题。您是否检查过类路径中是否有其他jaxb-impl-x.y.z.jarjaxb-api-k.l.m.jarJSonConfiguration查找类com.sun.xml.bind.annotation.OverrideAnnotationOf,它是JRE7rt.jar的一部分。

您可以使用以下简单程序检查JRE安装:

import com.sun.jersey.api.json.JSONConfiguration;


public class TestNaturalJSon {
    public static void main(String[] args) {
        JSONConfiguration config = JSONConfiguration.natural().build();

        System.out.println("OK");

    }

}

如果使用 maven,则可以使用具有以下依赖项的 pom:

<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.12</version>

    <exclusions>
        <exclusion>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        </exclusion>
        <exclusion>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        </exclusion>
    </exclusions>

   </dependency>
</dependencies>
 类似资料:
  • 我使用intellij IDEA进行开发,我注意到IDEA在Java7上运行时,maven插件在下载依赖项时出现了问题(我在Windows7)。然而,在Java6上运行它就没有这个问题了。 以下是idea.log的摘录 我按照建议做了以下几点 > 确保我的/etc/hosts文件中有 将添加到我的idea64.exe.vmoptions,因此文件如下所示 谢谢你的帮助。

  • 我使用jaxb进行解组,但当我使用ForkJoinPool execute()方法时,我会得到一个“java.log.ClassNotFoundException:com.sun.xml.internal.bind.v2.ContextFactory”,但我确信在我的运行时类路径中存在,因为当我不使用ForkJoinPool时,它会正常工作。。。你知道这方面的问题或解决方法吗? 我使用Java 1

  • 问题内容: 我有具有以下结构的Java类(类名并不表示任何东西,我只是在组成它们)。 整理测试实例时,JAXB生成的XML输出是我遇到的问题。XML输出将始终如下所示: 如您所见,某些元素没有正确缩进(即,最深的元素,计数和句点)。这是为什么?我创建JAXB上下文的方式有问题吗?还是JAXB可以递归缩进多少元素有最大限制?我该如何解决?请注意,我也已将JAXB_FORMATTED_OUTPUT设置

  • 我遵循了Head First Servlets中一个非常简单的例子。 我在浏览器地址栏输入localhost:8080,显示的是Tomcat的主页,服务器好像没问题。然后我创建了一个名为< code>Ch1Servlet的servlet。它看起来是这样的: 接下来,需要一个web.xml的配置文件。所以是这样的: 在编译了Ch1Servlet.java之后,我得到了一个类文件,它被放在WEB-IN

  • 我的Spring启动应用程序正试图使用Spring数据r2dbc连接到5.7。设置似乎非常简单。但是,我一直遇到意想不到的异常。 任何帮助都将不胜感激。 日志: application.yaml build.gradle

  • ** 当我运行相同的应用程序与API级别23或21它正常工作,但我面临的问题API 17 logcat显示E/dalvikvm:找不到类android.util.ArrayMap如果你有任何想法,请与我分享 谢啦 **