Подтвердить что ты не робот

Использование внутренних классов солнца с помощью javac

Есть ли способ отключить ограничения javac 1.6.0_22, которые мешают мне использовать внутренние классы JRE, такие как sun.awt.event.*?

Я не ищет:

  • объяснение, почему это запрещено.
  • предложение использовать разные классы
  • предложение использовать отражение
  • предложение использовать ecj/eclipse

Я просто хочу знать, возможно ли это или нет, и если это так, то как.

4b9b3361

Ответ 1

Я сам нашел ответ.

Когда javac компилирует код, он по умолчанию не ссылается на rt.jar. Вместо этого он использует специальный файл символа lib/ct.sym с заглушками класса.

Удивительно, что этот файл содержит много, но не все внутренние классы солнца. В моем случае один из тех более-более обычных, чем обычно, классов был sun.awt.event.IgnorePaintEvent.

И ответ на мой вопрос: javac -XDignore.symbol.file

Что javac использует для компиляции rt.jar.

Ответ 2

В дополнение к ответу @marcin-wisnicki, если вы используете Maven, обратите внимание на то, что плагин компилятора будет тихо отбрасывать любые -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>
            ...

Ответ 3

Обычно это вызывает только предупреждение; например.

[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 рассматривать предупреждения как ошибки.

Ответ 4

Там лучшее решение. Сначала добавьте параметр в javac -XDenableSunApiLintControl, а затем используйте @SupressWarnings("sunapi") в вашем коде.