当我使用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”代替什么?
编辑:人们,我知道最好避免导致警告的代码。通常这将是我的方法。但是我在这里编译第三方代码,我不想重写。我只是想添加正确的注释来抑制警告,以便我可以实际做些什么的警告不会被埋没。
答案 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
对象,因为将来可能会更改参考实现