57

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

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

4

7 回答 7

54

无法抑制此特定警告。至少不是正式的。

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

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

于 2012-12-13T14:48:39.360 回答
25

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgument>-XDignore.symbol.file</compilerArgument>
    </configuration>
</plugin>
于 2013-10-21T20:04:57.403 回答
14

看到这个答案

无法阻止 ant 生成编译器 Sun 专有 API 警告

测试代码

@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
于 2017-02-23T03:15:35.953 回答
8

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

于 2012-12-13T08:23:59.613 回答
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);
    }

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

于 2012-12-13T10:18:33.657 回答
1

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

为什么会发生?

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

这种行为是错误的吗?

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

解决方法

以下代码片段通过使用由创建的 a 创建一个CachedRowSet对象:RowSetFactoryRowSetProvider

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

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

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

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

于 2020-04-16T16:25:29.033 回答
0

尝试 javac 选项

-Xlint:none

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

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

于 2012-12-13T08:24:09.317 回答