【问题标题】:Suppress javac warning "...is internal proprietary API and may be removed in a future release"禁止 javac 警告“...是内部专有 API,可能会在将来的版本中删除”
【发布时间】:2012-12-01 02:21:18
【问题描述】:

当我使用 JDK 1.7.0 在 OS X 上编译 Spring JDBC 源代码时,我收到以下警告:

warning: CachedRowSetImpl is internal proprietary API and may be removed in a future release

如何在编译期间隐藏警告消息?

我已经知道并使用 Java 的 @SuppressWarning 注释。我正在寻找它的具体用途来抑制我所描述的警告。

我的具体问题是,在这行代码中:

@SuppressWarnings("valuegoeshere")

“valuegoeshere”应该换成什么?

编辑:人们,我知道最好避免导致警告的代码。通常这就是我的方法。但是,我在这里编译不想重写的第三方代码。我只是想添加正确的注释来抑制警告,这样我就可以实际做一些事情的警告不会被埋没。

【问题讨论】:

标签: java javac


【解决方案1】:

引用它的接口CachedRowSet而不是实现。

【讨论】:

  • 谢谢,但这里不可能。我需要编写自己的 CachedRowSet 实现才能使其正常工作。
【解决方案2】:

试试 javac 选项

-Xlint:none

如果您从 IDE 编译,它应该有一个禁用警告的选项。

这将禁用所有不属于 Java 语言规范的警告。因此,例如“未选中”警告将不会被阻止。

【讨论】:

  • 我不想取消所有警告。只是一种特定警告类型的一个特定实例。
  • @Steve 那么你别无选择,只能听从鲍里斯的回答。
【解决方案3】:

我试过了

@SuppressWarnings("all")

但这没有用。

所以我采取了一种可怕的、可怕的工具,我一般不推荐这种方法,但在这种特殊情况下,警告就消失了。我使用反射来实例化 com.sun.rowset.CachedRowSetImpl 类的新实例。

我替换了这行,导致警告:

    return new CachedRowSetImpl();

用这个块:

    try {
        final Class<?> aClass = Class.forName("com.sun.rowset.CachedRowSetImpl");
        return (CachedRowSet) aClass.newInstance();
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }

请不要在未考虑任何其他选项的情况下在您自己的代码中执行此操作。

【讨论】:

  • 那段代码到底有什么问题?看起来还不错
【解决方案4】:

这个特别的警告cannot be suppressed。至少不是正式的。

关于专有 API 的警告意味着您不应该 使用导致警告的 API。孙不支持 此类 API 和警告将无法抑制。

如果您特别坚定,您可以使用高度未记录的javac -XDignore.symbol.file 标志,它将针对Sun 的内部rt.jar 而不是面向公众的符号文件ct.sym 编译您的程序。 rt.jar 不会产生此警告。

【讨论】:

【解决方案5】:

如果您使用的是 maven,您可能有兴趣将以下内容添加到您的 pom.xml 文件中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgument>-XDignore.symbol.file</compilerArgument>
    </configuration>
</plugin>

【讨论】:

  • 这似乎对我不起作用。有什么想法为什么不呢?
  • 它适用于我使用 Oracle 的 Java 8 编译器。我刚刚用一个单文件项目验证了它没有上面的配置就报了一个警告,然后在我添加了上面的部分之后警告就消失了。我对此的回答并不明确,但是您是否将该部分放在build:plugins 中?否则,我没有任何其他想法。
  • 其实经过进一步检查,似乎是来自maven-processor-plugin:maven-processor-plugin:2.2.4:process(process)@project---诊断:/home /project/src/main/java/Test.java:8:警告:sun.misc.Signal 是内部专有 API,可能会在未来版本中删除 import sun.misc.Signal;
  • 将 outputDiagnostics 设置为 false 可以解决此问题。此处引用的类似问题:stackoverflow.com/questions/22634008/…
  • 对于这些不起作用的情况,只需将&lt;fork&gt;true&lt;/fork&gt;添加到配置中
【解决方案6】:

看到这个答案

Cannot stop ant from generating compiler Sun proprietary API warnings

测试代码

@SuppressWarnings("sunapi")
sun.security.x509.X509CertImpl test;

编译命令行

javac test.java -Werror -Xlint:sunapi -XDenableSunApiLintControl

javac test.java -Werror -Xlint:all -XDenableSunApiLintControl

编译通过,没有任何警告

去掉SuppressWarnings标签,重新编译:

然后报错

test.java:4: warning: X509CertImpl is internal proprietary API and may be removed in a future release
        sun.security.x509.X509CertImpl test;
                     ^
error: warnings found and -Werror specified
1 error
1 warning

【讨论】:

    【解决方案7】:

    我承认这个答案是一个迟到的收获,你会解决你的问题。但是我遇到了和你一样的问题,研究我找到了这个解决方案。

    为什么会这样?

    https://www.oracle.com/java/technologies/faq-sun-packages.html

    这种行为有错吗?

    不,它是一个警告,告诉我们 ChachedRowSetImpl 不属于公共接口,因此不保证兼容性。

    解决方法

    以下代码 sn-p 使用由RowSetProvider 创建的RowSetFactory 创建一个CachedRowSet 对象:

    RowSetFactory factory = RowSetProvider.newFactory();
    CachedRowSet rowset = factory.createCachedRowSet();
    

    这会从实现类com.sun.rowset.CachedRowSetImpl 创建一个CachedRowSet 对象。相当于下面的语句:

    CachedRowSet rowset = new com.sun.rowset.CachedRowSetImpl();
    

    但是,建议从 RowSetFactory 创建一个 CachedRowSet 对象,因为将来可能会更改参考实现

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2023-01-18
      • 1970-01-01
      • 2016-08-03
      • 2019-08-12
      相关资源
      最近更新 更多