JAXB在Java 7下发布,它说它无法找到RI 2.1.0

时间:2012-04-05 16:04:32

标签: java linux jaxb jersey jax-rs

我正在使用Oracle Java 7 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 -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)

然而,当我运行使用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 jar添加到我认可的java目录中以使其正常工作(还有Java 7更新3)。

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

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的测试程序,我仍然得到错误。我开始认为这是一个VM问题:

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错误。这里的奇怪的事情是在Windows下工作,但不是在Ubuntu上。当我使用认可的设置运行下面的@ andhi的测试程序时,我得到了OK而不是错误。但由于某种原因,看起来像Ubuntu下的Spring没有拿起安装在背书目录中的JSR173 jar文件(这是STAX实现)。

3 个答案:

答案 0 :(得分:3)

对我来说就像一个Classpath问题。您是否检查了类路径中是否还有其他jaxb-impl-x.y.z.jarjaxb-api-k.l.m.jarJSonConfiguration会查找属于JRE7 com.sun.xml.bind.annotation.OverrideAnnotationOf的类rt.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>

答案 1 :(得分:2)

要知道加载类的位置,您应该使用-verbose:class选项运行JVM命令行。

这样,你可以通过在抛出javax.xml.stream.FactoryConfigurationError异常之前或在诊断消息JAXB RI 2.1.10 not found之前查看最新的详细行来猜出错误。

所以你可以得到一个实现来自jar并检查是否使用了endorsed目录......

答案 2 :(得分:1)

我很欣赏这里的所有评论,但没有人设法解决我的问题,所以我按照以下方式解决了这个问题。我将Metro-2.2安装到Tomcat 7.然后,因为我的应用程序是一个Spring命令行应用程序我构建了一个战争,所以它可以在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的组件。 spring-config参数是我的顶级spring配置文件,它将从命令行加载。我的蚂蚁构建然后从这个应用程序构建一个战争,它运行良好。所以仍然不确定为什么我在jvm中支持的文件没有工作,因为使用verbose:class标志显示它们已经加载,但是通过使用tomcat作为容器并加载我需要的类,Jersey很高兴所有的问题已经消失。再次感谢您对此问题的所有帮助。