Использование внутренних классов солнца с помощью javac
Есть ли способ отключить ограничения javac 1.6.0_22, которые мешают мне использовать внутренние классы JRE, такие как sun.awt.event.*
?
Я не ищет:
- объяснение, почему это запрещено.
- предложение использовать разные классы
- предложение использовать отражение
- предложение использовать ecj/eclipse
Я просто хочу знать, возможно ли это или нет, и если это так, то как.
Ответы
Ответ 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")
в вашем коде.