זמן הריצה של Java

סביבת זמן הריצה של Java היא מחסנית התוכנה שאחראית להתקנת קוד האפליקציה והתלות שלה, ולאחר מכן להפעלת האפליקציה בסביבה הגמישה.

גרסאות Java

‫Java 25 משתמש ב-buildpacks. בעזרת buildpacks אפשר ליצור ולהגדיר קונטיינרים שאפשר לפרוס ב- Google Cloud.

הרשימה המלאה של גרסאות Java הנתמכות וגרסאות Ubuntu התואמות שלהן מופיעה בלוח הזמנים לתמיכה בזמן ריצה.

כדי להשתמש בגרסת Java נתמכת, צריך:

  • מתקינים את גרסה 420.0.0 ואילך של ה-CLI של gcloud. אפשר לעדכן את כלי ה-CLI על ידי הרצת הפקודה gcloud components update. כדי לראות את הגרסה המותקנת, אפשר להריץ את הפקודה gcloud version.

  • כדי לפרוס באמצעות Maven, צריך להוסיף את App Engine Maven plugin לקובץ pom.xml:

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.8.1</version>
    </plugin>

    אפשרויות אחרות לפריסה כוללות את הפקודה gcloud app deploy או את App Engine Gradle plugin.

  • כדי לציין מערכת הפעלה, צריך לכלול את ההגדרות runtime_config ו-operating_system בקובץ app.yaml.

  • אפשר גם לציין גרסת זמן ריצה על ידי הוספת ההגדרה runtime_version לקובץ app.yaml. כברירת מחדל, נעשה שימוש בגרסת Java העדכנית ביותר אם לא מציינים את ההגדרה runtime_version.

    דוגמאות

    • כדי לציין Java 25 ב-Ubuntu 24:

      runtime: java
      env: flex
      
      runtime_config:
          operating_system: "ubuntu24"
          runtime_version: "25"
      
    • כדי לציין את הגרסה העדכנית ביותר של Java שנתמכת ב-Ubuntu 24:

        runtime: java
        env: flex
      
        runtime_config:
            operating_system: "ubuntu24"
      

גרסאות קודמות של זמן הריצה

ב-Java 8, מציינים את ההגדרות runtime_config ו-jdk בקובץ app.yaml.

‫Java 8 תומכת ב:

  • הוא מבוסס על זמן הריצה Eclipse Jetty 9 ומריץ את Jetty 9 באמצעות Servlet 3.1.

  • קוד השרת שלכם שמקשיב ליציאה 8080 כחלק מהאפליקציה. התכונה הזו מאפשרת לכם להשתמש במסגרות מיקרו-שירותים כמו SparkJava ו-Spring-Boot.

דוגמאות

  • ציון גרסה 9 של Jetty (ברירת מחדל / אופציונלי):

      runtime_config:
        jdk: openjdk8
        server: jetty9
    
  • ציון גרסה 8 של Java:

      runtime_config:
        jdk: openjdk8
    
  • דוגמה ל-app.yaml ב-Java 8:

    runtime: java
    env: flex
    
    handlers:
    - url: /.*
      script: this field is required, but ignored

במאמרים pom.xml ו-build.gradle מוסבר איך להגדיר את Maven ואת Gradle.

קבצים אופציונליים

קבצי ההגדרות האלה הם אופציונליים:

ממקמים את הקבצים האלה ברמה העליונה של MyDir. אם אתם משתמשים באחד מהקבצים האלה, אתם צריכים לפרוס אותם בנפרד באמצעות הפקודה gcloud app deploy.

web.xml הוא אופציונלי ונדרש רק אם לא משתמשים בהערות של Servlet 3.x.

אתם יכולים למקם תוכן אינטרנט סטטי, וגם דפי JavaServer, בספרייה webapp/. ‫Jetty 9, שמשמש כקונטיינר Servlet בסביבה הגמישה של App Engine, משתמש ב- Apache Jasper כיישום JSP שמוגדר כברירת מחדל וכולל taglibs של JSTL.

קובץ ה-Dockerfile הוא אופציונלי ומשמש להתאמה אישית של זמן הריצה של Java.

הפעלת דחיסה באמצעות gzip

הגורם המטפל gzip נכלל ב-Jetty אבל לא מופעל כברירת מחדל. כדי להפעיל את המודול הזה, צריך להגדיר את משתנה הסביבה JETTY_MODULES_ENABLE=gzip בקובץ app.yaml:

env_variables:
  JETTY_MODULES_ENABLE: 'gzip'

שימוש במדריך למתחילים

‫Jetty יכולה לקצר את זמן ההפעלה של האפליקציה על ידי סריקה מראש של התוכן שלה ויצירה של קובצי הגדרות. אם אתם משתמשים בתמונה מורחבת, אתם יכולים להפעיל את מדריך למתחילים על ידי הרצה /scripts/jetty/quickstart.sh ב-קובץ Docker, אחרי שמוסיפים את אפליקציית ה-WAR.

משתני סביבה

אפשר להגדיר את משתני הסביבה האופציונליים הבאים שספציפיים לזמן הריצה של Java 8/Jetty 9. אפשר גם להגדיר משתני סביבה של OpenJDK 8.

כדי להגדיר משתני סביבה, משתמשים במפתח env_variables בקובץ app.yaml.

משתנה סביבה גימיק לתא צילום לאירועים ערך/תגובה
JETTY_PROPERTIES רשימה של זוגות name=value שמופרדים בפסיקים, שמצורפת ל-$JETTY_ARGS
JETTY_MODULES_ENABLE רשימת מודולים להפעלה, מופרדת בפסיקים, שמוסיפים בסוף $JETTY_ARGS
JETTY_MODULES_DISABLE רשימה של מודולים שמופרדים בפסיקים שרוצים להשבית על ידי הסרה מ-$JETTY_BASE/start.d
JETTY_ARGS ארגומנטים שמועברים ל-start.jar של Jetty. כאן צריך להעביר את כל הארגומנטים שמשמשים להגדרת Jetty בהתאמה אישית.
JAVA_OPTS ארגומנטים של זמן ריצה של JVM

Cloud Logging משופר (בטא)

כשמריצים בסביבה הגמישה של App Engine, אפשר להגדיר את Java Util Logging לשליחת יומנים ל-Cloud Logging על ידי הגדרת משתנה הסביבה JETTY_ARGS. לדוגמה:

 env_variables:
   JETTY_ARGS: -Djava.util.logging.config.file=WEB-INF/logging.properties

צריך לספק קובץ logging.properties שמגדיר LoggingHandler באופן הבא:

handlers=com.google.cloud.logging.LoggingHandler

# Optional configuration
.level=INFO
com.google.cloud.logging.LoggingHandler.level=FINE
com.google.cloud.logging.LoggingHandler.log=gae_app.log
com.google.cloud.logging.LoggingHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%3$s: %5$s%6$s

תמיכה בסביבות זמן ריצה אחרות של Java

אם אתם צריכים להשתמש בגרסת Java שלא נתמכת, אתם יכולים ליצור סביבת ריצה בהתאמה אישית ולבחור תמונת בסיס תקינה עם גרסת Java שאתם צריכים.

לגבי תמונות בסיס שסופקו על ידי Google או תמונות בסיס של Docker Java, אפשר לעיין במאמר בנושא יצירת סביבות ריצה בהתאמה אישית.

ארגון הקבצים

עץ המקור אמור להיראות כך:

MyDir/
  [pom.xml]
  [build.gradle]
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    docker/
      [Dockerfile]
    java/
      com.example.mycode/
        MyCode.java
    webapp/
      [index.html]
      [jsp.jsp]
      WEB-INF/
        [web.xml]

בדיקה מקומית

כשבודקים בסביבה המקומית, אפשר להשתמש בשירותים Google Cloud שמבוססים על אמולציה ולא בשירותים Google Cloud מרוחקים. אפשר להשתמש באמולטורים הבאים:

משתמשים בפקודה gcloud כדי להפעיל אותם לפני שמריצים את האפליקציה:

gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start

Maven

מוסיפים את השורות האלה לקובץ pom.xml של Maven כדי להוסיף את הפלאגין Jetty 9 Maven:

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>9.4.2.v20170220</version>
</plugin>

כדי להריץ את האפליקציה באופן מקומי, משתמשים בפקודת Maven:

mvn jetty:run-exploded

Gradle

פועלים לפי ההוראות שבמאמר יצירת פרויקט Gradle חדש כדי להוסיף את תוסף Gretty Gradle ל-build.gradle, ומשתמשים בפקודה:

gradle jettyRun

פריסת האפליקציה

כדי לאתחל את Google Cloud CLI, מריצים את הפקודה:

gcloud init

אחרי שמסיימים את ההגדרות, אפשר להשתמש ב-Google Cloud CLI כדי לפרוס את הספרייה הזו שמכילה את הקבצים app.yaml ו-WAR באמצעות הפקודה:

gcloud app deploy app.yaml

אם אתם משתמשים באחד מקובצי התצורה האופציונליים (index.yaml, ‏cron.yaml ו-dispatch.yaml), צריך לפרוס אותם בנפרד באמצעות הפקודה gcloud. לדוגמה:

gcloud app deploy cron.yaml

Maven

משתמשים ב-Maven כדי לפרוס את האפליקציה:

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

מחליפים את PROJECT_ID במזהה הפרויקט. Google Cloud אם קובץ pom.xml שלכם כבר מציין את מזהה הפרויקט, אין צורך לכלול את המאפיין -Dapp.deploy.projectId בפקודה שמריצים.

Gradle

משתמשים ב-Gradle כדי לפרוס את האפליקציה:

gradle appengineDeploy