7

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 -バージョン

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 update 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());

まだ1.6に設定されていたので、ソース= 1.7とターゲット= 1.7でコンパイルしようとしましたが、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 は、承認されたディレクトリ (STAX 実装) にインストールされている JSR173 jar ファイルを取得していないようです。

4

3 に答える 3

3

クラスパスの問題のように思えます。クラスパスに他のjaxb-impl-x.y.z.jarまたはがあるかどうかを確認しましたか? jaxb-api-k.l.m.jarはJRE7 の一部であるJSonConfigurationクラスを探します。com.sun.xml.bind.annotation.OverrideAnnotationOfrt.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>
于 2012-04-21T05:01:11.270 に答える
2

クラスがどこからロードされたかを知るには、オプションを指定して JVM コマンドラインを実行する必要があり-verbose:classます。

javax.xml.stream.FactoryConfigurationErrorそうすれば、例外がスローされる直前、または診断メッセージの直前に最新の詳細行を確認することで、何が問題なのかを推測できますJAXB RI 2.1.10 not found

したがって、実装元のjarを取得し、endorsedディレクトリが使用されているかどうかを確認できます...

于 2012-04-24T10:11:01.527 に答える
1

ここでのすべてのコメントに感謝しますが、誰も私の問題を解決できなかったので、次のように回避しました。Metro-2.2 を Tomcat 7 にインストールしました。その後、私のアプリは Spring コマンド ライン アプリなので、Tomcat コンテナーで実行できるように war を作成しました。これには、アプリのすべてのライブラリを 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>

このアプリには Web 向けのコンポーネントがないため、index.jsp は空です。spring-config パラメーターは、コマンド ラインから読み込まれる最上位のスプリング構成ファイルです。私の ant ビルドは、このアプリから戦争を構築し、うまく動作します。したがって、jvm で承認されたファイルが verbose:class フラグを使用して提案されたように機能しなかった理由はまだわかりません。問題はなくなりました。この問題に関するすべてのヘルプにもう一度感謝します。

于 2012-04-25T16:46:03.917 に答える