52

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

不是在寻找:

  1. 解释为什么它被禁止。
  2. 建议使用不同的类
  3. 使用反射的建议
  4. 使用 ecj/eclipse 的建议

我只是想知道它是否可能,如果它是那么如何。

4

6 回答 6

93

我自己找到了答案。

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

令人惊讶的是,该文件包含许多但不是全部的内部 sun 类。就我而言,其中一个比平常更内部的类是sun.awt.event.IgnorePaintEvent.

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

这就是 javac 用于编译rt.jar.

于 2010-11-01T16:08:33.210 回答
40

如果您使用 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>
            ...
于 2015-05-27T03:10:10.530 回答
1

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

于 2017-01-18T16:00:03.860 回答
0

通常,这只会产生警告消息;例如

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

于 2010-11-01T04:32:52.503 回答
0

如果您使用 Gradle,则需要使用这些选项

compileJava {
    // enable using internal libraries
    options.fork = true
    options.forkOptions.executable = 'javac'
    options.compilerArgs << '-XDignore.symbol.file' }
于 2021-12-24T09:32:44.613 回答
0

另一种方法是改变jdk。

在我的情况下,项目 java 版本 1.8。我从 jdk 11 开始使用。因此在我的项目中发现了这个错误。所以我把我的jdk从11改成了1.8。它对我有用。

于 2022-03-02T04:29:44.150 回答