有没有办法禁用 javac 1.6.0_22 的限制,阻止我使用 JRE 内部类sun.awt.event.*
?
我不是在寻找:
- 解释为什么它被禁止。
- 建议使用不同的类
- 使用反射的建议
- 使用 ecj/eclipse 的建议
我只是想知道它是否可能,如果它是那么如何。
我自己找到了答案。
当 javac 编译代码时,默认情况下它不会链接rt.jar
。lib/ct.sym
相反,它使用带有类存根的特殊符号文件。
令人惊讶的是,该文件包含许多但不是全部的内部 sun 类。就我而言,其中一个比平常更内部的类是sun.awt.event.IgnorePaintEvent
.
我的问题的答案是:javac -XDignore.symbol.file
这就是 javac 用于编译rt.jar
.
如果您使用 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>
...
有一个更好的解决方案。首先将选项添加到 javac -XDenableSunApiLintControl
,然后@SupressWarnings("sunapi")
在您的代码中使用。
通常,这只会产生警告消息;例如
[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 编译器将警告视为错误。
如果您使用 Gradle,则需要使用这些选项
compileJava {
// enable using internal libraries
options.fork = true
options.forkOptions.executable = 'javac'
options.compilerArgs << '-XDignore.symbol.file' }
另一种方法是改变jdk。
在我的情况下,项目 java 版本 1.8。我从 jdk 11 开始使用。因此在我的项目中发现了这个错误。所以我把我的jdk从11改成了1.8。它对我有用。