בדף הזה מוסבר איך להתקין ולהשתמש בשירותים הכלולים בגרסה הנתמכת האחרונה של Java בסביבה הרגילה של App Engine. האפליקציה יכולה לגשת לשירותים הכלולים באמצעות App Engine API JAR.
לפני שמתחילים
אפשר לעיין ברשימת ממשקי API של שירותים מהדור הקודם שאפשר להפעיל בגרסה הנתמכת האחרונה של Java.
כדי להציג את הדף הזה, האפליקציה צריכה לפעול בגרסת Java נתמכת. כדי להעביר את האפליקציה מסביבת ההרצה מהדור הראשון לסביבת ההרצה מהדור השני, אפשר לעיין במאמר העברה מ-Java 8 לסביבת ההרצה העדכנית של Java ובקטע שיקולים להעברה.
אם אתם משתמשים בחבילת שירותים מדור קודם ורוצים לשדרג ל-Java 25, תוכלו לקרוא את המאמר שדרוג של אפליקציה קיימת כדי לקבל מידע נוסף על אפשרויות ההגדרה.
התקנת קובץ ה-JAR של App Engine API
כדי להשתמש בשירותים מדור קודם שצורפו לאפליקציית Java העדכנית הנתמכת, צריך להשתמש בקובץ appengine-web.xml כדי להגדיר את האפליקציה (במקום בקובץ app.yaml).
בדוגמה הבאה מוסבר איך להוסיף הגדרות תצורה בקובץ appengine-web.xml לגרסאות שונות של Java. כדי להשתמש בגרסה הנתמכת האחרונה בהגדרת ברירת המחדל, צריך לעדכן את רכיבי ה-servlet של האפליקציה ואת התלות שלה כך שיכללו את מרחב השמות Jakarta. מידע נוסף על אפשרויות התצורה זמין במאמר שדרוג אפליקציה קיימת.
מוסיפים את ההגדרות הבאות לקובץ appengine-web.xml בהתאם לגרסת Java:
בדוגמה הזו, האפליקציה יכולה להשתמש רק בשירותים המצורפים Datastore ו-Memcache:
Java 25 (EE 11)
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<runtime>java25</runtime>
<system-properties>
<property name="appengine.use.EE11" value="true"/>
</system-properties>
<app-engine-bundled-services>
<api>datastore_v3</api>
<api>memcache</api>
<!-- LIST YOUR SERVICES -->
</app-engine-bundled-services>
</appengine-web-app>
Java 21 (EE 10)
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<runtime>java21</runtime>
<system-properties>
<property name="appengine.use.EE10" value="true"/>
</system-properties>
<app-engine-bundled-services>
<api>datastore_v3</api>
<api>memcache</api>
<!-- LIST YOUR SERVICES -->
</app-engine-bundled-services>
</appengine-web-app>
Java 17 (EE 8)
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<runtime>java17</runtime>
<system-properties>
<property name="appengine.use.EE8" value="true"/>
</system-properties>
<app-engine-bundled-services>
<api>datastore_v3</api>
<api>memcache</api>
<!-- LIST YOUR SERVICES -->
</app-engine-bundled-services>
</appengine-web-app>
כדי לציין את השירותים הקודמים בחבילה כתלות, מוסיפים את השורות הבאות לקובץ pom.xml:
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>2.0.31</version> <!-- or later-->
</dependency>
אם האפליקציה משתמשת בקובץ web.xml, צריך להגדיר את הרכיב <app-engine-bundled-service>.
הגדרות התצורה של app_engine_bundled_services מפורטות במאמר web.xml.
<app-engine-bundled-services>
<api>memcache</api>
<api>datastore_v3</api>
<api>modules</api>
<api>search</api>
<api><!-- LIST YOUR SERVICES --></api>
</app-engine-bundled-services>
כדי לפרוס את אפליקציית Java 25, מריצים את הפקודה
mvn appengine:deploy
או את הפקודה
gcloud app deploy ~/my_app/WEB-INF/appengine-web.xml
באפליקציית אינטרנט שעברה קומפילציה והכנה לפריסה.
נקודת כניסה שמוגדרת כברירת מחדל ל-Java 25
אפליקציות Java 25 נהנות מהגדרות משתמש נוספות כשמפעילים את ה-JVM לאפליקציות אינטרנט.
נקודת הכניסה שמשמשת לאתחול ה-JVM כברירת מחדל נוצרת על ידי App Engine buildpacks.
בעצם, זה שווה להגדרה של נקודת הכניסה הזו בקובץ appengine-web.xml. לדוגמה:
java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED -showversion -Xms32M -Xmx204M -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+PrintCommandLineFlags -Dclasspath.runtimebase=/base/java_runtime -Djava.class.path=/base/java_runtime/runtime-main.jar -Djava.library.path=/base/java_runtime: com/google/apphosting/runtime/JavaRuntimeMainWithDefaults --fixed_application_path=/workspace /base/java_runtime
אנחנו לא ממליצים לשנות את נקודת הכניסה הזו שמוגדרת כברירת מחדל, כי הגדרות הזיכרון מחושבות על סמך סוג המופע (F1, F2, F4) והזיכרון שזמין.
כברירת מחדל, אנחנו משתמשים ב---add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED כדי לפתוח כמה ממשקי JDK API שנדרשים.
תכונות של נקודות כניסה
אפשר להתאים אישית את נקודת הכניסה לגרסאות Java מהדור השני באמצעות משתני סביבה שהוגדרו על ידי המשתמש והתווספו לקובץ ההגדרות appengine-web.xml.
בטבלה הבאה מפורטים משתני הסביבה שאפשר להשתמש בהם כדי להפעיל, להשבית או להגדיר תכונות, וערכי ברירת המחדל אם הם לא מוגדרים:
| משתנה סביבה | תיאור | סוג | ברירת מחדל |
|---|---|---|---|
CPROF_ENABLE |
Stackdriver Profiler | בוליאני | false |
GAE_MEMORY_MB |
זיכרון זמין | size | הוגדר על ידי App Engine או /proc/meminfo-400M |
HEAP_SIZE_RATIO |
זיכרון עבור הערימה | אחוז | 80 |
HEAP_SIZE_MB |
הערימה הזמינה | size | ${HEAP_SIZE_RATIO}% מתוך ${GAE_MEMORY_MB} |
JAVA_HEAP_OPTS |
ארגומנטים של ערימה (heap) ב-JVM | ארגומנטים של JVM | -Xms${HEAP_SIZE_MB}M -Xmx${HEAP_SIZE_MB}M |
JAVA_GC_OPTS |
ארגומנטים של JVM GC | ארגומנטים של JVM | -XX:+UseG1GC plus configuration |
JAVA_USER_OPTS |
ארגומנטים אחרים של JVM | ארגומנטים של JVM | |
JAVA_OPTS |
ארגומנטים של JVM | ארגומנטים של JVM | מידע נוסף מופיע בהמשך |
אם לא מגדירים במפורש, ברירת המחדל של JAVA_OPTS היא:
JAVA_OPTS:=-showversion \
$JAVA_HEAP_OPTS \
$JAVA_GC_OPTS \
$JAVA_USER_OPTS
אם CPROF_ENABLE הוא true, נקודת הכניסה שמוגדרת כברירת מחדל מוסיפה את PROFILER_AGENT באופן הבא:
-agentpath:/opt/cprof/profiler_java_agent.so=--logtostderr
לדוגמה, אם קוד האפליקציה שלכם צריך עוד דגלים של -add-opens, אתם יכולים להשתמש במשתנה הסביבה JAVA_USER_OPTS שמוגדר בקובץ appengine-web.xml:
<env-variables>
<env-var name="JAVA_USER_OPTS" value="--add-opens java.base/java.util=ALL-UNNAMED" />
</env-variables>
שיקולים לגבי מיגרציה
אם אתם עוברים ל-Java runtime מהדור השני והאפליקציה שלכם משתמשת בשירותים קודמים שצורפו לחבילה, כדאי שתכירו את הנקודות הבאות:
- כדי לבדוק את היכולות של שירותים מקובצים מדור קודם באפליקציית Java מהדור השני, אפשר להשתמש בשרת פיתוח מקומי.
- בשונה מסביבת זמן הריצה של Java 8, סביבות זמן הריצה של Java מהדור השני כוללות את JVM כחלק מזיכרון המופע. אם מופיעות שגיאות שקשורות לזיכרון ביומנים, כדאי להגדיל את גודל מחלקת המופעים בקובץ
appengine-web.xml. - אם האפליקציה מנסה לקרוא ל-API שלא מופעל בסביבות זמן הריצה של Java מהדור השני, היא תקבל שגיאת
com.google.apphosting.api.ApiProxy$FeatureNotEnabledException. - כל האפליקציות נחשבות בטוחות לשימוש עם שרשורים בסביבות זמן הריצה של Java מהדור השני. צריך להסיר את הרכיב
threadsafeבקובץapp.yamlאוappengine-web.xmlכשמעבירים מ-Java 8 לזמן הריצה העדכני של Java.
דוגמה (Datastore)
דוגמה לשימוש ב-Firestore במצב Datastore (Datastore) מופיעה בדוגמת הקוד ב-GitHub של שירותים מאוגדים מדור קודם ל-Java 11.