אריזה מחדש של קובץ WAR לקובץ JAR

אם אתם עוברים לגרסה העדכנית ביותר של Java שנתמכת, והאפליקציה שלכם לא משתמשת בשירותים מדור קודם שצורפו לחבילה, אתם צריכים לארוז מחדש את אפליקציית האינטרנט שלכם ב-Java 8 ב-App Engine לקובץ JAR שניתן להפעלה.

באפליקציה שלכם צריך להיות מחלקה Main שמפעילה שרת אינטרנט שמגיב לבקשות HTTP ביציאה 8080, שאולי מצוינת על ידי משתנה הסביבה PORT.

לדוגמה:

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Main {

  public static void main(String[] args) throws IOException {
    // Create an instance of HttpServer bound to port defined by the 
    // PORT environment variable when present, otherwise on 8080.
    int port = Integer.parseInt(System.getenv().getOrDefault("PORT", "8080"));
    HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);

    // Set root URI path.
    server.createContext("/", (var t) -> {
      byte[] response = "Hello World from Google App Engine Java 11.".getBytes();
      t.sendResponseHeaders(200, response.length);
      try (OutputStream os = t.getResponseBody()) {
        os.write(response);
      }
    });

    // Start the server.
    server.start();
  }
}

דוגמה להעברה של WAR (Java 11)

ההוראות הבאות מסבירות איך לארוז מחדש אפליקציית Java 8 hello-world של App Engine כקובץ JAR כדי להריץ אותה בסביבת זמן הריצה של Java 11.

המיגרציה מתבצעת באמצעות ארטיפקט appengine-simple-jetty-main. הקוד הזה מספק מחלקה Main עם שרת אינטרנט פשוט של Jetty שטוען קובץ WAR ואורז את האפליקציה שלכם לקובץ JAR להפעלה:

  1. משכפלים את ארטיפקט ה-Embedded Jetty Server למחשב המקומי:

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples
    

    אפשרות נוספת היא להוריד את הדוגמה כקובץ ZIP ולחלץ אותה.

  2. עוברים לספרייה שמכילה את הקוד לדוגמה:

    cd java-docs-samples/appengine-java11/appengine-simple-jetty-main/
    
  3. מתקינים את יחסי התלות באופן מקומי:

    mvn install
    
  4. מוסיפים את הקוד הבא לקובץ pom.xml של הפרויקט:

    • appengine-simple-jetty-main תלות:
      <dependency>
        <groupId>com.example.appengine</groupId>
        <artifactId>simple-jetty-main</artifactId>
        <version>1</version>
        <scope>provided</scope>
      </dependency>
    • maven-dependency פלאגין:
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.6.1</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>
                ${project.build.directory}/appengine-staging
              </outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
      ‫App Engine פורס קבצים שנמצאים בספרייה ${build.directory}/appengine-staging. אם מוסיפים את הפלאגין maven-dependency ל-build, ‏ App Engine מתקין את יחסי התלות שצוינו בתיקייה הנכונה.
  5. יוצרים רכיב entrypoint בקובץ app.yaml כדי לקרוא לאובייקט appengine-simple-jetty-main ולהעביר את קובץ ה-WAR כארגומנט. לדוגמה, אפשר לראות את קובץ helloworld-servlet לדוגמה: app.yaml

    runtime: java11
    entrypoint: 'java -cp "*" com.example.appengine.jetty.Main helloworld.war'
  6. כדי להריץ את האפליקציה באופן מקומי:

    1. אורזים את האפליקציה:

      mvn clean package
      
    2. מפעילים את השרת עם קובץ ה-WAR כארגומנט.

      לדוגמה, כדי להפעיל את השרת בדוגמה helloworld-servlet, מריצים את הפקודה הבאה מהתיקייה java-docs-samples/appengine-java11/appengine-simple-jetty-main/:

      mvn exec:java -Dexec.args="../helloworld-java8/target/helloworld.war"
      
    3. בדפדפן האינטרנט, מזינים את הכתובת הבאה:

      http://localhost:8080

  7. כדי לפרוס את האפליקציה:

    כלי gcloud

    gcloud app deploy

    פלאגין Maven

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

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