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:
Falls Sie noch kein Google Cloud -Projekt haben, erstellen Sie eines.
Installieren Sie das Google Cloud CLI, damit Sie das Beispiel mit den Anmeldedaten Ihres Projekts ausführen können.
Melden Sie sich nach der Installation der Google Cloud CLI mit dem folgenden Befehl mit Standardanmeldedaten für Anwendungen an:
gcloud auth application-default loginInstallieren Sie eine geeignete JDK-Distribution wie GraalVM.
Prüfen Sie mit dem folgenden Befehl, ob Sie die Erweiterung für native Bilder installiert haben:
gu install native-imagePrüfen Sie, ob die Standardversion von Java richtig eingestellt ist, indem Sie
java -versionin 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
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>Führen Sie
mvn package -Pnativeaus, um das native Image im Ordner./targetzu generieren.Führen Sie die Anwendung wie jede andere ausführbare Datei aus. Beispiel:
./target/$IMAGE_NAMEDas Plug-in verwendet standardmäßig die Artefakt-ID des Projekts.
Anleitung zur Gradle-Einrichtung
Legen Sie die Hauptklasse Ihrer Anwendung fest, indem Sie den folgenden Text in Ihre
build.gradle-Datei einfügen.application { mainClass.set('$MAIN_CLASS') }Fügen Sie das native-gradle-Plug-in hinzu, wie unter Plug-in hinzufügen beschrieben.
Rufen Sie
./gradlew nativeCompileauf, um das native Image im Verzeichnis./build/native/nativeCompilezu erstellen.Führen Sie die Anwendung als ausführbare Datei aus. Beispiel:
./build/native/nativeCompile/$PROJECT_NAMEMit 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“.