Is there a way to disable restrictions of javac 1.6.0_22 that prevent me from using JRE internal classes like sun.awt.event.*
?
I'm not looking for:
- an explanation why it is forbidden.
- suggestion to use different classes
- suggestion to use reflection
- suggestion to use ecj/eclipse
I just want to know if it is possible or not, and if it is then how.
I have found the answer myself.
When javac is compiling code it doesn't link against rt.jar
by default.
Instead it uses special symbol file lib/ct.sym
with class stubs.
Surprisingly this file contains many but not all of internal sun classes.
In my case one of those more-internal-than-usual classes was sun.awt.event.IgnorePaintEvent
.
And the answer to my question is: javac -XDignore.symbol.file
That's what javac uses for compiling rt.jar
.
In addition to the answer by @marcin-wisnicki if you're using Maven, note that the compiler plugin will silently drop any -XD flags, unless you also specify
<fork>true</fork>
: e.g.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArgs>
<arg>-XDignore.symbol.file</arg>
</compilerArgs>
<fork>true</fork>
</configuration>
...
Normally, this only produces a Warning message; e.g.
[javac] /media/disk/opensso2/opensso/products/federation/openfm/source/com/sun/identity/wss/xmlsig/WSSSignatureProvider.java:46: warning: com.sun.org.apache.xpath.internal.XPathAPI is Sun proprietary API and may be removed in a future release
[javac] import com.sun.org.apache.xpath.internal.XPathAPI;
Perhaps you have told the Java compiler to treat warnings as errors.
There's a better solution. First add the option to javac -XDenableSunApiLintControl
and then use @SupressWarnings("sunapi")
in your code.
来源:https://stackoverflow.com/questions/4065401/using-internal-sun-classes-with-javac