Como empacotar novamente um arquivo WAR em um arquivo JAR

Se você estiver migrando para a versão Java compatível mais recente e seu aplicativo não usar serviços incluídos legados, será necessário reempacotar o aplicativo da Web Java 8 do App Engine em um arquivo JAR executável.

Seu aplicativo precisa ter uma classe Main que inicie um servidor da Web que responda às solicitações HTTP na porta especificada pela variável de ambiente PORT, normalmente 8081.

Exemplo:

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

Exemplo de migração do WAR (Java 11)

As instruções a seguir demonstram como empacotar novamente um aplicativo hello-world Java 8 do App Engine como um JAR a ser executado no ambiente de execução do Java 11.

A migração usa o artefato appengine-simple-jetty-main. Isso fornece uma classe Main com um servidor da Web Jetty simples que carrega um arquivo WAR e empacota seu aplicativo em um arquivo JAR executável:

  1. Clone o artefato do servidor incorporado do Jetty na sua máquina local:

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

    Também é possível fazer o download do exemplo como um arquivo zip e extraí-lo.

  2. Acesse o diretório que contém o exemplo de código:

    cd java-docs-samples/appengine-java11/appengine-simple-jetty-main/
    
  3. Instale a dependência localmente:

    mvn install
    
  4. Adicione o seguinte código ao arquivo pom.xml do projeto:

    • Dependência de 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>
      O App Engine implanta os arquivos localizados no diretório ${build.directory}/appengine-staging. Ao adicionar o plug-in maven-dependency à build, o App Engine instala as dependências especificadas na pasta correta.
  5. Crie um elemento entrypoint no arquivo app.yaml para chamar o objeto appengine-simple-jetty-main e insira o arquivo WAR como um argumento. Por exemplo, consulte o arquivo app.yaml da amostra helloworld-servlet:

    runtime: java11
    entrypoint: 'java -cp "*" com.example.appengine.jetty.Main helloworld.war'
  6. Para executar seu aplicativo localmente:

    1. Empacote seu aplicativo:

      mvn clean package
      
    2. Inicie o servidor com o arquivo WAR como um argumento.

      Por exemplo, você pode iniciar o servidor no helloworld-servlet de exemplo executando o seguinte comando da sua pasta java-docs-samples/appengine-java11/appengine-simple-jetty-main/:

      mvn exec:java -Dexec.args="../helloworld-java8/target/helloworld.war"
      
    3. No navegador da Web, digite este endereço:

      http://localhost:8080

  7. Para implantar o aplicativo:

    Ferramentas do gcloud

    gcloud app deploy

    Plug-in do Maven

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

    Substitua PROJECT_ID pelo ID do projeto do Google Cloud. Se o arquivo pom.xmlespecificar o ID do projeto, não será necessário incluir a propriedade -Dapp.deploy.projectId no comando executado.