Interne Sun-Klassen mit Javac verwenden

Lesezeit: 3 Minuten

Interne Sun Klassen mit Javac verwenden
Marcin Wisnicki

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

Ich bin nicht Auf der Suche nach:

  1. eine Erklärung, warum es verboten ist.
  2. Vorschlag, verschiedene Klassen zu verwenden
  3. Vorschlag, Reflexion zu verwenden
  4. Vorschlag zur Verwendung von ecj/eclipse

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

  • Welche Fehler bekommst du genau? Ich kann dagegen kompilieren sun.awt.* ganz gut mit Javac 1.6.0_22 (allerdings auf dem Mac).

    – Thilo

    1. Nov. 10 um 3:00 Uhr

  • Ich mache einige Experimente mit Swing/AWT und muss auf ihre Interna zugreifen.

    – Marcin Wisnicki

    1. November 10 um 16:18 Uhr

  • Das gleiche Problem gilt für andere Klassen wie SOAP-Implementierungen in com.sun.xml.internal.messaging.saaj.util.* und der gleiche Trick vonignore.symbol.file (oberste Antwort unten) ist eine Problemumgehung. Fügen Sie diesen Kommentar hier hinzu, um Leuten zu helfen, die in diesem Kontext nach diesem Problem suchen.

    – jlevy

    15. Juni 15 um 22:41 Uhr

Ich habe die Antwort selbst gefunden.

Wenn Javac Code kompiliert, wird nicht verlinkt rt.jar standardmäßig. Stattdessen verwendet es eine spezielle Symboldatei lib/ct.sym mit Klassenstummeln.

Überraschenderweise enthält diese Datei viele, aber nicht alle internen Sonnenklassen. In meinem Fall war das eine dieser mehr internen als üblichen Klassen sun.awt.event.IgnorePaintEvent.

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

Das ist es, was Javac zum Kompilieren verwendet rt.jar.

  • Ich hatte genau das gleiche Problem, versuchte zu kompilieren, aber ich bekam diesen Fehler package sun.nio.fs does not exist Pro sun.nio.fs.BasicFileAttributesHolder

    – Jaime Hablutzel

    10. Januar 13 um 20:19 Uhr

  • Siehe auch die Antwort von @karmakaze für eine zusätzliche Problemumgehung für das Maven-Compiler-Plugin.

    – Karmakaze

    27. Mai 15 um 3:16 Uhr

  • Wie füge ich dies über die Eingabeaufforderung hinzu? Ich muss es für meine Web-App anwenden, die in Tomcat unter Linux bereitgestellt wird

    – Santhosh

    10. Juli 15 um 11:42 Uhr

  • @SanKrish – Welcher Teil von javac -XDignore.symbol.file verstehst du nicht?

    – Stefan C

    10. Juli 15 um 12:35 Uhr

  • @Stefan Danke für deine Antwort. Ich wollte nur die konfigurieren javac -XDignore.symbol.file für Kater statt für eine Klasse

    – Santhosh

    10. Juli 15 um 12:36 Uhr


1643119026 441 Interne Sun Klassen mit Javac verwenden
Karmakaze

Zusätzlich zur Antwort von @marcin-wisnicki, wenn Sie Maven verwenden, Beachten Sie, dass das Compiler-Plugin stillschweigend alle -XD-Flags löschen wirdsofern Sie nicht auch angeben
<fork>true</fork>: z.B

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

  • Wie füge ich dies über die Eingabeaufforderung hinzu? Ich muss es für meine Web-App anwenden, die in Tomcat unter Linux bereitgestellt wird

    – Santhosh

    10. Juli 15 um 11:43 Uhr

  • Mann, du hast mir damit den Tag gerettet! Danke 🙂

    – Anakin001

    10. März 16 um 7:36 Uhr

  • @Anakin001 freut mich das zu hören. Diese obskuren Hits sind diejenigen, an die ich mich wirklich gerne gewöhne.

    – Karmakaze

    11. März 16 um 18:16 Uhr

  • Können Sie mir bitte sagen, welches Plugin ich für die ivy.xml-Datei hinzufügen kann.

    – Pardha Saradhi

    6. März 20 um 7:15 Uhr

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

Wenn Sie Gradle verwenden, müssen Sie diese Optionen verwenden

compileJava {
    // enable using internal libraries
    options.fork = true
    options.forkOptions.executable="javac"
    options.compilerArgs << '-XDignore.symbol.file' }

  • Wie füge ich dies über die Eingabeaufforderung hinzu? Ich muss es für meine Web-App anwenden, die in Tomcat unter Linux bereitgestellt wird

    – Santhosh

    10. Juli 15 um 11:43 Uhr

.

632990cookie-checkInterne Sun-Klassen mit Javac verwenden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy