באמצעות ספריות הלקוח של Cloud ל-Java, אפשר לקמפל אפליקציות כתמונות מקוריות. הגישה הזו משפרת את הביצועים של האפליקציה, כי היא משתמשת בהידור מראש כדי לקצר את זמן ההפעלה מההתחלה (cold startup) ואת הזיכרון שבשימוש של האפליקציה.
גרסאות של ספריות לקוח
מוודאים שאתם משתמשים בגרסה 25.4.0 ואילך של רשימת החומרים של ספריות הענן (libraries-bom) או שאתם משתמשים בספריות לקוח שפורסמו אחרי מאי 2022.
רוב המשתמשים מנהלים את הגרסאות של ספריות הלקוח באמצעות libraries-bom.
זו דרך קלה לוודא שהגרסאות של כל ספריות הלקוח בפרויקט תואמות זו לזו ועדכניות.
מידע נוסף על החלת libraries-bom על הפרויקט ב-Maven וב-Gradle זמין במאמר עדכון הפרויקט לשימוש ב-BOM.
ספריות נתמכות
ספריות הלקוח היציבות של Google Cloud ל-Java שמפורטות בטבלת ממשקי ה-API הנתמכים תומכות בהידור של תמונות מקוריות.
לפני שמתחילים
כדי להשתמש בהידור תמונות מקוריות עם ספריות הלקוח הרצויות של Google Cloud ל-Java, צריך לבצע את השלבים הבאים:
אם עדיין לא עשיתם זאת, אתם צריכים ליצור Google Cloud פרויקט.
מתקינים את Google Cloud CLI, שמאפשר להריץ את הדוגמה עם פרטי הכניסה של הפרויקט.
אחרי שמתקינים את Google Cloud CLI, מתחברים באמצעות Application Default Credentials באמצעות הפקודה הבאה:
gcloud auth application-default loginמתקינים הפצת JDK מתאימה, כמו GraalVM.
כדי לוודא שהתקנתם את התוסף של התמונה המקורית, מריצים את הפקודה הבאה:
gu install native-imageמריצים את הפקודה
java -versionבמסוף כדי לוודא שגרסת ברירת המחדל של Java מוגדרת בצורה נכונה. הפלט אמור להיראות כך: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)
פיתוח גרסת build של אפליקציה כתמונה מקורית
בהוראות הבאות נעשה שימוש בתוספים של כלי ה-build המקוריים כדי ליצור אפליקציה כקובץ אימג' מקורי.
הוראות להגדרת Maven
כדי להשתמש בתוסף Maven המקורי כדי ליצור את קובץ האימג' המקורי של האפליקציה, צריך להעתיק את הטקסט הזה ולהדביק אותו ב-POM של האפליקציה. חשוב להחליף את MAIN_CLASS בשם המחלקה הראשית ואת VERSION בגרסה של התוסף המקורי של Maven, כמו
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>מריצים את הפקודה
mvn package -Pnativeכדי ליצור את התמונה המקורית בתיקייה./target.מריצים את האפליקציה כמו כל קובץ הפעלה. לדוגמה,
./target/$IMAGE_NAME. התוסף משתמש כברירת מחדל במזהה הארטיפקט של הפרויקט.
הוראות להגדרת Gradle
כדי להגדיר את המחלקה הראשית של האפליקציה, מעתיקים את הטקסט הבא לקובץ
build.gradle.application { mainClass.set('$MAIN_CLASS') }מוסיפים את התוסף native-gradle כמו שמתואר בקטע הוספת התוסף.
מריצים את הפקודה
./gradlew nativeCompileכדי ליצור את התמונה המקורית בספרייה./build/native/nativeCompile.מפעילים את האפליקציה כקובץ הפעלה. לדוגמה,
./build/native/nativeCompile/$PROJECT_NAME. בתוסף, שם התמונה מוגדר כברירת מחדל לשם הפרויקט.
בעיות נפוצות
תאימות ל-SLF4J
אם אתם מבצעים קומפילציה של תמונה מקורית בספריית לקוח עם התלות SLF4J, יכול להיות שתופיע שגיאה בזמן הבנייה.
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.
כדי לפתור את הבעיה, מוסיפים את --initialize-at-run-time=io.grpc.netty.shaded.io.netty לקובץ META-INF/native-image/$GROUP_ID/$ARTIFACT_ID/native-image.properties.
עם זאת, התצורה הזו עלולה לגרום לפגיעה בביצועים של התמונה המקורית שנוצרה, בהתאם לנתיב הקוד שהאפליקציה שלכם עוקבת אחריו.
אפשרות אחרת היא להשתמש בספריית רישום אחרת, כמו Flogger או בספרייה java.util.logging.
שאלות
אפשר לדווח על בעיות ולשאול שאלות שקשורות לקומפילציה של תמונות מקוריות של Java בדף הבעיות ב-GitHub.