Réempaqueter un fichier WAR dans un fichier JAR

Si vous migrez vers la dernière version Java compatible et que votre application n'utilise pas les anciens services groupés, vous devez réempaqueter votre application Web Java 8 App Engine dans un fichier JAR exécutable.

Votre application doit comporter une classe Main qui démarre un serveur Web répondant aux requêtes HTTP sur le port spécifié par la variable d'environnement PORT, généralement 8081.

Exemple :

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

Exemple de migration WAR (Java 11)

Les instructions suivantes montrent comment réempaqueter une application Java 8 hello-world App Engine en tant que fichier JAR à exécuter sur l'environnement d'exécution Java 11.

La migration utilise l'artefact appengine-simple-jetty-main. Cela fournit une classe Main avec un serveur Web Jetty simple qui charge un fichier WAR et empaquette votre application dans un fichier JAR exécutable :

  1. Clonez l'artefact Embedded Jetty Server sur votre ordinateur local :

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

    Vous pouvez également télécharger l'exemple en tant que fichier zip et l'extraire.

  2. Accédez au répertoire qui contient l'exemple de code :

    cd java-docs-samples/appengine-java11/appengine-simple-jetty-main/
    
  3. Installez la dépendance en local :

    mvn install
    
  4. Ajoutez le code suivant dans le fichier pom.xml de votre projet :

    • Dépendance appengine-simple-jetty-main :
      <dependency>
        <groupId>com.example.appengine</groupId>
        <artifactId>simple-jetty-main</artifactId>
        <version>1</version>
        <scope>provided</scope>
      </dependency>
    • Plug-in 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 déploie les fichiers situés dans le répertoire ${build.directory}/appengine-staging. En ajoutant le plug-in maven-dependency à votre compilation, App Engine installe les dépendances spécifiées dans le dossier approprié.
  5. Créez un élément entrypoint dans votre fichier app.yaml pour appeler l'objet appengine-simple-jetty-main et transmettre votre fichier WAR en tant qu'argument. Par exemple, consultez l'exemple helloworld-servlet du fichier app.yaml :

    runtime: java11
    entrypoint: 'java -cp "*" com.example.appengine.jetty.Main helloworld.war'
  6. Pour exécuter votre application localement, procédez comme suit :

    1. Empaqueter votre application :

      mvn clean package
      
    2. Démarrez le serveur avec votre fichier WAR en tant qu'argument.

      Par exemple, vous pouvez démarrer le serveur dans l'exemple helloworld-servlet en exécutant la commande suivante à partir du dossier java-docs-samples/appengine-java11/appengine-simple-jetty-main/ :

      mvn exec:java -Dexec.args="../helloworld-java8/target/helloworld.war"
      
    3. Dans votre navigateur Web, saisissez l'adresse suivante :

      http://localhost:8080

  7. Pour déployer votre application, procédez comme suit :

    Outils gcloud

    gcloud app deploy

    Plug-in Maven

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

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud. Si votre ID de projet est déjà inclus dans le fichier pom.xml, vous n'avez pas besoin d'inclure la propriété -Dapp.deploy.projectId dans la commande que vous exécutez.