Suppress javac warning "...is internal proprietary API and may be removed in a future release"
JavaJavacJava Problem Overview
When I compile the Spring JDBC source on OS X with JDK 1.7.0, I get this warning:
warning: CachedRowSetImpl is internal proprietary API and may be removed in a future release
How do I suppress the warning message during a compile?
I already know and use Java's @SuppressWarning annotations. I'm looking for the specific use of this to suppress the warning I've described.
My question specifically is, in this line of code:
@SuppressWarnings("valuegoeshere")
what should "valuegoeshere" be replaced with?
EDIT: People, I know that it is best to avoid the code that leads to the warning. And usually that would be my approach. However I'm compiling third-party code here which I don't want to rewrite. I just want to add the correct annotation to suppress the warning, so that warnings I can actually do something about don't get buried.
Java Solutions
Solution 1 - Java
This particular warning cannot be suppressed. At least not officially.
> The warning about proprietary API means that you should not use the API which causes the warning. Sun does not support such API and the warning will not be suppressible.
If you're particularly determined, you can use the highly undocumented javac -XDignore.symbol.file
flag which will compile your program against Sun's internal rt.jar
rather than the public-facing symbol file ct.sym
. rt.jar
doesn't produce this warning.
Solution 2 - Java
If you are using maven, you might be interested in adding the following to your pom.xml
file:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>-XDignore.symbol.file</compilerArgument>
</configuration>
</plugin>
Solution 3 - Java
see this answer > https://stackoverflow.com/questions/9613857/cannot-stop-ant-from-generating-compiler-sun-proprietary-api-warnings/34966719#34966719
Testing code
@SuppressWarnings("sunapi")
sun.security.x509.X509CertImpl test;
compiling command line
javac test.java -Werror -Xlint:sunapi -XDenableSunApiLintControl
or
javac test.java -Werror -Xlint:all -XDenableSunApiLintControl
compile passed without any warnings
remove the SuppressWarnings
tag and compile again:
an error is reported then
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
Solution 4 - Java
Reference its interface CachedRowSet not the implementation.
Solution 5 - Java
I tried
@SuppressWarnings("all")
but that didn't work.
So I resorted to a horrible, horrible kludge which I don't recommend in general, but in this specific case made the warning go away. I used reflection to instantiate a new instance of the com.sun.rowset.CachedRowSetImpl class.
I replaced this line, which caused the warning:
return new CachedRowSetImpl();
with this block:
try {
final Class<?> aClass = Class.forName("com.sun.rowset.CachedRowSetImpl");
return (CachedRowSet) aClass.newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
Please don't do this in your own code without first considering any other option.
Solution 6 - Java
I acknowledge that this answer is a late harvest, and you will have solved your problem. But I got stuck in the same problem as you, and researching I found this solution.
Why happens?
https://www.oracle.com/java/technologies/faq-sun-packages.html
Is this behavior wrong?
No, its a warning telling us that ChachedRowSetImpl does not belong to the public interface, therefore compatibility is not guaranteed.
Workaround
The following code snippet creates a CachedRowSet
object by using a RowSetFactory
which is created by the RowSetProvider
:
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet rowset = factory.createCachedRowSet();
This creates a CachedRowSet
object from the implementation class com.sun.rowset.CachedRowSetImpl
. It’s equivalent to the following statement:
CachedRowSet rowset = new com.sun.rowset.CachedRowSetImpl();
However, it’s recommended to create a CachedRowSet
object from a RowSetFactory because the reference implementation may be changed in future
Solution 7 - Java
Try the javac option
-Xlint:none
If you compile from an IDE, it should have an option to disable warnings.
This will disable ALL warnings that are not a part of Java Language Specification. So for example "unchecked" warning will not be blocked.