使用javac的内部sun类
有没有办法来禁用javac 1.6.0_22,阻止我使用JRE内部类像sun.awt.event.*
?
我不是在寻找:
- 这是为什么被禁止的解释。
- build议使用不同的类
- build议使用reflection
- 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")
。