WAR-Datei in eine JAR-Datei verpacken

Wenn Sie zur neuesten unterstützten Java-Version migrieren und Ihre Anwendung keine gebündelten Legacy-Dienste verwendet, müssen Sie Ihre App Engine Java 8-Webanwendung in eine ausführbare JAR-Datei neu verpacken.

Ihre Anwendung muss eine Main-Klasse haben, die einen Webserver startet. Dieser antwortet auf HTTP-Anfragen von dem Port 8080, der mit der Umgebungsvariablen PORT festgelegt werden kann.

Beispiel:

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();
  }
}

Beispiel für die WAR-Migration (Java 11)

In der folgenden Anleitung wird gezeigt, wie Sie eine App Engine Java 8 hello-world-Anwendung als JAR-Paket zur Ausführung in der Java 11-Laufzeit neu verpacken.

Bei der Migration wird das Artefakt appengine-simple-jetty-main verwendet. Dadurch wird eine Main-Klasse mit einem einfachen Jetty-Webserver bereitgestellt, der eine WAR-Datei lädt und Ihre Anwendung in einer ausführbaren JAR-Datei verpackt:

  1. Klonen Sie das Artefakt des eingebetteten Jetty Server auf Ihren lokalen Computer:

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

    Sie können auch das Beispiel als ZIP-Datei herunterladen und extrahieren.

  2. Wechseln Sie zu dem Verzeichnis, das den Beispielcode enthält:

    cd java-docs-samples/appengine-java11/appengine-simple-jetty-main/
    
  3. Installieren Sie die Abhängigkeit lokal:

    mvn install
    
  4. Fügen Sie der Projektdatei pom.xml folgenden Code hinzu:

    • appengine-simple-jetty-main Abhängigkeit
      <dependency>
        <groupId>com.example.appengine</groupId>
        <artifactId>simple-jetty-main</artifactId>
        <version>1</version>
        <scope>provided</scope>
      </dependency>
    • maven-dependency Plug-in
      <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 stellt Dateien im Verzeichnis ${build.directory}/appengine-staging bereit. Wenn Sie dem Build das Plug-in maven-dependency hinzufügen, installiert App Engine die angegebenen Abhängigkeiten in den richtigen Ordner.
  5. Erstellen Sie ein entrypoint-Element in Ihrer app.yaml-Datei, um das appengine-simple-jetty-main-Objekt aufzurufen, und übergeben Sie die WAR-Datei als Argument. Sehen Sie sich zur Veranschaulichung die Datei app.yaml des helloworld-servlet-Beispiels an:

    runtime: java11
    entrypoint: 'java -cp "*" com.example.appengine.jetty.Main helloworld.war'
  6. So führen Sie Ihre Anwendung lokal aus:

    1. Verpacken Sie Ihre Anwendung:

      mvn clean package
      
    2. Starten Sie den Server mit Ihrer WAR-Datei als Argument.

      Sie können den Server beispielsweise im helloworld-servlet-Beispiel starten, indem Sie den folgenden Befehl aus dem Ordner java-docs-samples/appengine-java11/appengine-simple-jetty-main/ ausführen:

      mvn exec:java -Dexec.args="../helloworld-java8/target/helloworld.war"
      
    3. Geben Sie im Webbrowser die folgende Adresse ein:

      http://localhost:8080

  7. So stellen Sie Ihre Anwendung bereit:

    gcloud-Tool

    gcloud app deploy

    Maven-Plug-in

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

    Ersetzen Sie PROJECT_ID durch die ID Ihres Google Cloud-Projekts. Wenn in der Datei pom.xml bereits Ihre Projekt-ID angegeben ist, müssen Sie das Attribut -Dapp.deploy.projectId nicht in dem von Ihnen ausgeführten Befehl einfügen.