web-dev-qa-db-ja.com

javacで内部Sunクラスを使用する

Sun.awt.event.*のようなJRE内部クラスの使用を妨げるjavac 1.6.0_22の制限を無効にする方法はありますか?

私はnotを探しています:

  1. それが禁止されている理由の説明。
  2. 異なるクラスを使用する提案
  3. リフレクションを使用する提案
  4. ecj/Eclipseを使用する提案

可能かどうか、それがどのように可能かを知りたいだけです。

50
Marcin Wisnicki

自分で答えを見つけました。

Javacがコードをコンパイルしているとき、デフォルトではrt.jarに対してリンクしません。代わりに、クラススタブで特別なシンボルファイルlib/ct.symを使用します。

驚いたことに、このファイルには、すべてではありませんが多くの内部Sunクラスが含まれています。私の場合、これらの通常より内部的なクラスの1つはSun.awt.event.IgnorePaintEventでした。

そして私の質問への答えは:javac -XDignore.symbol.file

これはjavacがrt.jarのコンパイルに使用するものです。

89
Marcin Wisnicki

Mavenを使用している場合の@ marcin-wisnickiによる回答に加えて、 コンパイラプラグインは-XDフラグ を静かにドロップすることに注意してください。 <fork>true</fork>も指定します:例.

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <compilerArgs>
                    <arg>-XDignore.symbol.file</arg>
                </compilerArgs>
                <fork>true</fork>
            </configuration>
            ...
31
karmakaze

通常、これは警告メッセージのみを生成します。例えば.

[javac] /media/disk/opensso2/opensso/products/federation/openfm/source/com/Sun/identity/wss/xmlsig/WSSSignatureProvider.Java:46: warning: com.Sun.org.Apache.xpath.internal.XPathAPI is Sun proprietary API and may be removed in a future release
[javac] import com.Sun.org.Apache.xpath.internal.XPathAPI;

おそらく、Javaコンパイラに警告をエラーとして処理するように指示した可能性があります。

0
Stephen C

より良い解決策があります。最初にオプションをjavac _-XDenableSunApiLintControl_に追加してから、コードで@SupressWarnings("sunapi")を使用します。

0
juancn