24

ClientTransportException をキャッチしようとしていますが、プログラムがコンパイル段階で失敗し、次の例外が発生します。

[ERROR]\workspace\rates\java\service\bundle1\src\main\java\com\connector\ws\TestClass1.java:[72,70] package com.sun.xml.internal.ws.client does not exist

私が知っているように、このパッケージはrt.jarからのもので、jreに存在します

@SuppressWarnings("restriction") を追加すると、Eclipse Maven プラグインからコンパイルされますが、IntelliJ Idea (maven 経由) またはコマンドラインからはコンパイルされません。

@SuppressWarnings Eclipse を削除すると、次の警告が表示されます

Access restriction: The type ClientTransportException is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar

私は同様の質問を見つけましたが、答えは私にとって十分に明確ではありません.rt.jarでこのクラスを作成でき、IntelliJ Ideaもそれを見ることができます。

誰かがそのような動作とその解決策を説明できますか?

4

9 に答える 9

22

このFAQによると、「sun」パッケージを直接呼び出すのは悪い習慣です。私が同じ問題に遭遇したとき、javax.xml.ws.WebServiceException代わりにキャッチすることで修正されました(artbristolが提案したように)。

于 2013-08-19T17:28:40.313 に答える
16

次を使用して、このエラーを取り除くことができます。

javac -XDignore.symbol.file=true

これは、ct.sym の代わりに rt.jar を使用するために javac に渡す引数です ( ct.symはデフォルトで使用され、ターゲットの古いバージョンにコンパイルするために必要です)。

ct.symrt.jar のすべてのクラスが含まれているわけではありません。クラスの使用sun.*は使用されるべきではないため、それらのクラス スタブが存在しない可能性がありct.sym、コンパイルが失敗します。

への呼び出しをsun.*削除すると、この問題が解決するはずです。(sun パッケージを使用するのは悪い習慣です)

参考文献:

https://blogs.oracle.com/geertjan/ctsym-steals-the-asm-class

実は、JDK には「ct.sym」というものがあります。javac がコードをコンパイルしているとき、rt.jar に対してリンクしません。代わりに、クラス スタブを含む特別なシンボル ファイル lib/ct.sym を使用します。内部 JDK クラスは内部クラスであるため、そのシンボル ファイルには入れられません。それらを使用したくないはずです。

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6778491

これはコンパイラの問題ではありません。ct.sym で提供される情報によると、javac は正しく動作しています。この問題は、ct.sym で何を使用できるようにするか (および何を非表示にするか) を決定する担当者に属します。このバグの正しいカテゴリをまだ特定できません。これは意図的なものです。おそらく、パッケージ名「com.sun.xml.internal....」がヒントに見えるかもしれません。ユーザーは、内部 JDK 実装クラスに依存するコードを記述しないでください。このようなクラスは、JDK の内部実装の詳細であり、予告なく変更される場合があります。

http://openjdk.java.net/jeps/247

JDK N および --release M、M < N の場合、プラットフォームのリリース M の文書化された API の署名データが必要です。このデータは、$JDK_ROOT/lib/ct.sym ファイルに保存されます。これは、JDK 8 の同じ名前のファイルと似ていますが、同じではありません。ct.sym ファイルは、削除されたクラスを含む ZIP ファイルです。ターゲット プラットフォーム バージョンのクラス ファイルに対応するファイル。JDK N および --release N の場合、コンパイル対象のクラス ファイルのソースとして JDK 独自のイメージが使用されます。ただし、観察可能なモジュールのリストは、文書化されたモジュールと jdk.unsupported モジュールに制限されています。


ノート

この場合、artbristolが示唆するように、ClientTransportExceptionクラスを使用せずに に置き換えた方がよいでしょう。javax.xml.ws.WebServiceException

于 2012-05-16T09:27:07.203 に答える
4

Jre システム ライブラリは、コンパイラへのアクセスを一部のパッケージに制限しますが、JDK にはアクセスできます。その場合、コードにエラーはありませんが、コンパイルすると、クラスが見つからない、パッケージが見つからないなどのエラーが表示されます。

その場合、2 つのプラクティスがあります。 1)コンパイルとビルドのために、 jre システム ライブラリのrt.jarをビルド パスに追加します。2)ビルド パスにjaxws-rt.jarを追加します。

2 番目のオプションは、ビルド パスに重複したライブラリを追加することを避けるため、適切なオプションです。

于 2016-04-27T11:07:58.777 に答える
3

この依存関係を pom.xml にインポートします

   <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.1.4</version>
   </dependency>
于 2018-05-23T15:57:55.727 に答える
-1

com.sun.*パッケージは使用しないでください。代わりに独自のクラスを使用して問題を解決できます。

/**
 * Copy of com.sun.xml.internal.ws.client.BindingProviderProperties since we're
 * not allowed to use com.sun.* packages..     
 */
public final class BindingProviderProperties {
    public static final java.lang.String CONNECT_TIMEOUT = "com.sun.xml.internal.ws.connect.timeout";
    public static final java.lang.String REQUEST_TIMEOUT = "com.sun.xml.internal.ws.request.timeout";
}
于 2017-12-06T14:27:55.700 に答える