web-dev-qa-db-de.com

Interne Sun-Klassen mit Javac verwenden

Gibt es eine Möglichkeit, die Einschränkungen von javac 1.6.0_22 zu deaktivieren, die mich daran hindern, JRE-interne Klassen wie Sun.awt.event.* zu verwenden?

Ich bin nicht suche nach:

  1. eine Erklärung, warum es verboten ist.
  2. vorschlag zur Verwendung verschiedener Klassen
  3. vorschlag zur Reflexion
  4. vorschlag zur Verwendung von ecj/Eclipse

Ich möchte nur wissen, ob es möglich ist oder nicht und ob es dann wie ist.

47
Marcin Wisnicki

Ich habe die Antwort selbst gefunden.

Wenn javac Code kompiliert, wird keine Verknüpfung zu rt.jar standardmäßig hergestellt Stattdessen wird die spezielle Symboldatei lib/ct.sym mit Klassenstubs verwendet.

Überraschenderweise enthält diese Datei viele, aber nicht alle internen Sun-Klassen . In meinem Fall war eine dieser mehr als gewöhnlich üblichen Klassen Sun.awt.event.IgnorePaintEvent.

Und die Antwort auf meine Frage lautet: javac -XDignore.symbol.file

Das ist, was javac verwendet, um rt.jar zu kompilieren.

84
Marcin Wisnicki

Zusätzlich zur Antwort von @ marcin-wisnicki bei Verwendung von Maven beachten Sie , dass das Compiler-Plugin alle -XD-Flags löscht, sofern Sie nicht auch <fork>true</fork> angeben: z.

<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>
            ...
29
karmakaze

Normalerweise wird nur eine Warnmeldung ausgegeben. z.B.

[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;

Vielleicht haben Sie den Java-Compiler angewiesen, Warnungen als Fehler zu behandeln.

0
Stephen C

Es gibt eine bessere Lösung. Fügen Sie zunächst die Option javac -XDenableSunApiLintControl hinzu und verwenden Sie dann @SupressWarnings("sunapi") in Ihrem Code.

0
juancn