抑制javac警告"...是内部专有API,可能在未来的版本中被移除"

61

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

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

我该如何在编译时屏蔽警告消息?

我已经知道并使用了Java的@SuppressWarning注释。我正在寻找特定用法来抑制我所描述的警告。

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

@SuppressWarnings("valuegoeshere")

"valuegoeshere"应该替换为什么?

编辑:大家好,我知道最好避免导致警告的代码。通常这是我的做法。但是我正在编译第三方代码,我不想重写它。我只想添加正确的注释来抑制警告,以便我实际可以处理的警告不会被掩盖。


1
@NandkumarTekale 我不知道,我没有使用Eclipse。我是使用Oracle的Java编译器从一个shell脚本进行编译的。 - Steve McLeod
可能是重复的问题:无法停止Ant生成编译器警告 - Ciro Santilli OurBigBook.com
为什么不使用Java 8提供的编码器而不是专有API,在Base64编码器的基础上,而不是抑制警告? - Raedwald
7个回答

54
这个特定的警告无法被抑制。至少在官方上是这样的。
关于专有API的警告意味着您不应该使用引起警告的API。Sun不支持这样的API,因此无法抑制该警告。
如果您特别坚决,可以使用高度不被记录的javac -XDignore.symbol.file标志,它将使您的程序针对Sun的内部rt.jar进行编译,而不是针对公共符号文件ct.symrt.jar不会产生这个警告。

3
现在并不正确(自jdk7以后),请参考这个答案https://dev59.com/kWYr5IYBdhLWcg3wOXsQ#42406330。 - William Leung
2
它仍然可以在Java 8中工作,但无法在Java 9中工作。有人找到了使用最新的Java 9版本的解决方案吗? - vip
我用这个成功解决了它:https://dev59.com/02kw5IYBdhLWcg3w1eC7#34966719 - Sridhar Sarnobat

26

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

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

1
这对我似乎不起作用。有什么想法为什么? - LadyCailin
1
我使用Oracle的Java 8编译器可以正常工作。我刚刚验证了一个单文件项目,发现如果没有上述配置,它会报告一个警告,然后在我添加了上面的部分后,警告就消失了。我的回答并没有明确说明这一点,但是你是否将该部分放在了build:plugins中?否则,我没有其他想法。 - Brandon
实际上,在进一步检查后,似乎是来自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; - LadyCailin
1
将 outputDiagnostics 设置为 false 可以解决这个问题。类似问题参考:https://stackoverflow.com/questions/22634008/maven-processor-plugin-to-ignore-undefined-symbols - LadyCailin
8
如果这种方法无效,只需将 <fork>true</fork> 添加到配置中即可。 - Alain Pannetier
显示剩余2条评论

18

查看此答案

无法阻止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

8

2
谢谢,但这里不可能。我需要编写自己的CachedRowSet实现才能使其工作。 - Steve McLeod

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);
    }

在考虑其他选项之前,请不要在自己的代码中这样做。


1
那段代码有什么问题吗?看起来没什么毛病。 - Enerccio

2

我承认这个答案有些晚了,你可能已经解决了你的问题。但是我也遇到了同样的问题,并且在研究中找到了解决办法。

为什么会出现这种情况?

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

这个行为是否不正确?

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

解决方法

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

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

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

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

然而,建议使用RowSetFactory创建一个CachedRowSet对象,因为参考实现可能会在未来更改


0

尝试使用javac选项

-Xlint:none

如果您从集成开发环境(IDE)编译,则应该有一个选项可以禁用警告。

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


我不想压制所有警告,只是针对一个特定的警告类型的一个具体实例。 - Steve McLeod
@Steve,那么你别无选择,只能遵循Boris的答案。 - Jakub Zaverka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接