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 a solicitações HTTP na porta 8080, que pode ser especificada pela variável de ambiente PORT.

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.