Native Images kompilieren

Mit den Cloud-Clientbibliotheken für Java können Sie Anwendungen als native Images kompilieren. Dieser Ansatz bietet Leistungsvorteile für Ihre Anwendung, da die Ahead-of-Time-Kompilierung genutzt wird, um die Kaltstartzeit und den Speicherbedarf Ihrer Anwendung zu verringern.

Clientbibliotheksversionen

Achten Sie darauf, dass Sie Version 25.4.0 oder höher der Cloud Libraries Bill of Materials (libraries-bom) verwenden oder dass Sie Clientbibliotheken verwenden, die nach Mai 2022 veröffentlicht wurden.

Die meisten Nutzer verwalten ihre Clientbibliotheksversionen über die libraries-bom. So können Sie ganz einfach prüfen, ob die Versionen aller Clientbibliotheken in Ihrem Projekt miteinander kompatibel und auf dem neuesten Stand sind.

Weitere Informationen zum Anwenden von libraries-bom auf Ihr Projekt in Maven und Gradle finden Sie unter Projekt für die Verwendung der BOM aktualisieren.

Unterstützte Bibliotheken

Die stabilen Google Cloud-Clientbibliotheken für Java, die in der Tabelle mit unterstützten APIs aufgeführt sind, unterstützen die Kompilierung nativer Images.

Hinweise

Wenn Sie die native Image-Kompilierung mit den gewünschten Google Cloud-Clientbibliotheken für Java verwenden möchten, führen Sie die folgenden erforderlichen Schritte aus:

  1. Falls Sie noch kein Google Cloud -Projekt haben, erstellen Sie eines.

  2. Installieren Sie das Google Cloud CLI, damit Sie das Beispiel mit den Anmeldedaten Ihres Projekts ausführen können.

  3. Melden Sie sich nach der Installation der Google Cloud CLI mit dem folgenden Befehl mit Standardanmeldedaten für Anwendungen an:

    gcloud auth application-default login
    
  4. Installieren Sie eine geeignete JDK-Distribution wie GraalVM.

  5. Prüfen Sie mit dem folgenden Befehl, ob Sie die Erweiterung für native Bilder installiert haben:

    gu install native-image
    
  6. Prüfen Sie, ob die Standardversion von Java richtig eingestellt ist, indem Sie java -version in einem Terminal ausführen. Die Ausgabe sieht etwa so aus:

    java -version
    openjdk version "17.0.9" 2023-10-17
    OpenJDK Runtime Environment GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22)
    OpenJDK 64-Bit Server VM GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22, mixed mode, sharing)
    

Anwendung als natives Image erstellen

In der folgenden Anleitung wird beschrieben, wie Sie eine Anwendung als natives Image erstellen. Dazu werden die nativen Build-Tools-Plug-ins verwendet.

Anleitung zur Einrichtung von Maven

  1. Kopieren Sie diesen Text und fügen Sie ihn in die POM-Datei Ihrer Anwendung ein, um das native Maven-Plug-in zum Erstellen des nativen Images für die Anwendung zu verwenden. Ersetzen Sie MAIN_CLASS durch den Namen Ihrer Hauptklasse und VERSION durch die Version des nativen Maven-Plug-ins, z. B. 0.10.1.

    <profiles>
        <profile>
            <id>native</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.graalvm.buildtools</groupId>
                        <artifactId>native-maven-plugin</artifactId>
                        <version>VERSION</version>
                        <extensions>true</extensions>
                        <configuration>
                            <mainClass>$MAIN_CLASS</mainClass>
                            <buildArgs>
                                <buildArg>--no-fallback</buildArg>
                                <buildArg>--no-server</buildArg>
                            </buildArgs>
                        </configuration>
                        <executions>
                            <execution>
                                <id>build-native</id>
                                <goals>
                                    <goal>build</goal>
                                </goals>
                                <phase>package</phase>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
    
  2. Führen Sie mvn package -Pnative aus, um das native Image im Ordner ./target zu generieren.

  3. Führen Sie die Anwendung wie jede andere ausführbare Datei aus. Beispiel: ./target/$IMAGE_NAME Das Plug-in verwendet standardmäßig die Artefakt-ID des Projekts.

Anleitung zur Gradle-Einrichtung

  1. Legen Sie die Hauptklasse Ihrer Anwendung fest, indem Sie den folgenden Text in Ihre build.gradle-Datei einfügen.

    application {
        mainClass.set('$MAIN_CLASS')
    }
    
  2. Fügen Sie das native-gradle-Plug-in hinzu, wie unter Plug-in hinzufügen beschrieben.

  3. Rufen Sie ./gradlew nativeCompile auf, um das native Image im Verzeichnis ./build/native/nativeCompile zu erstellen.

  4. Führen Sie die Anwendung als ausführbare Datei aus. Beispiel: ./build/native/nativeCompile/$PROJECT_NAME Mit dem Plug-in wird der Bildname standardmäßig auf den Projektnamen festgelegt.

Allgemeine Probleme

SLF4J-Kompatibilität

Wenn Sie die native Image-Kompilierung für eine Clientbibliothek mit der SLF4J-Abhängigkeit ausführen, wird möglicherweise der folgende Build-Zeitfehler angezeigt.

Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing io.grpc.netty.shaded.io.netty.util.internal.SystemPropertyUtil.getBoolean(java.lang.String, boolean)
Parsing context:
   at io.grpc.netty.shaded.io.netty.util.internal.SystemPropertyUtil.getBoolean(SystemPropertyUtil.java:96)
   at io.grpc.netty.shaded.io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:33)
   at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:153)
...
java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of org.slf4j.jul.JDK14LoggerAdapter are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use --trace-object-instantiation=org.slf4j.jul.JDK14LoggerAdapter.

Fügen Sie --initialize-at-run-time=io.grpc.netty.shaded.io.netty zu Ihrer Datei META-INF/native-image/$GROUP_ID/$ARTIFACT_ID/native-image.properties hinzu, um dieses Problem zu beheben.

Diese Konfiguration kann jedoch je nach dem von Ihrer Anwendung verwendeten Codepfad zu Leistungseinbußen für das generierte native Image führen.

Alternativ können Sie eine andere Logging-Bibliothek wie Flogger oder die java.util.logging-Bibliothek verwenden.

Fragen

Bitte melden Sie alle Probleme und Fragen zur Java-Kompilierung nativer Images auf der GitHub-Seite „Issues“.

Nächste Schritte