抑制javac警告“......是内部专有API,可能会在将来的版本中删除”

时间:2012-12-13 08:20:29

标签: java javac

当我使用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”代替什么?

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

7 个答案:

答案 0 :(得分:45)

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

  

有关专有API的警告意味着您不应该这样做   使用导致警告的API。 Sun不支持   这样的API和警告是不可取消的。

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

答案 1 :(得分:21)

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

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

答案 2 :(得分:10)

看到这个答案

  

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

答案 3 :(得分:7)

引用其接口CachedRowSet而不是实现。

答案 4 :(得分:3)

我试过

@SuppressWarnings("all")

但这没效果。

所以我使用了一个可怕的,可怕的kludge,我一般不推荐,但在这个特定情况下,警告消失了。我使用反射来实例化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);
    }

如果没有考虑任何其他选项,请不要在自己的代码中执行此操作。

答案 5 :(得分:0)

尝试使用javac选项

-Xlint:none

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

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

答案 6 :(得分:0)

我知道这个答案是晚收了,您将解决您的问题。但是我陷入了与您相同的问题,并且研究发现这种解决方案。

为什么会发生?

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

此行为是否错误?

否,它的警告告诉我们ChachedRowSetImpl不属于公共接口,因此不能保证兼容性。

解决方法

以下代码段通过使用CachedRowSet创建的RowSetFactory创建RowSetProvider对象:

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

这将从实现类CachedRowSet创建一个com.sun.rowset.CachedRowSetImpl对象。它等效于以下语句:

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

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