使用javac的内部sun类

有没有办法来禁用javac 1.6.0_22,阻止我使用JRE内部类像sun.awt.event.*

不是在寻找:

  1. 这是为什么被禁止的解释。
  2. build议使用不同的类
  3. build议使用reflection
  4. build议使用ecj / eclipse

我只是想知道是否有可能,如果是的话。

我自己find了答案。

当javac正在编译代码时,默认情况下它不会链接到rt.jar 。 相反,它使用特殊的符号文件lib/ct.sym和类存根。

令人惊讶的是,这个文件包含很多但不是全部的内部太阳类。 在我的情况下,那些比平常更内部的类是sun.awt.event.IgnorePaintEvent

而我的问题的答案是: javac -XDignore.symbol.file

这是javac用来编译rt.jar

除了@ 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> ... 

通常情况下,这只会产生一个警告信息。 例如

 [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编译器将警告视为错误。

有一个更好的解决scheme。 首先将选项添加到javac -XDenableSunApiLintControl ,然后在代码中使用@SupressWarnings("sunapi")