Reembalar um ficheiro WAR num ficheiro JAR

Se estiver a migrar para a versão Java suportada mais recente e a sua app não usar serviços agrupados antigos, tem de reempacotar a sua aplicação Web Java 8 do App Engine num ficheiro JAR executável.

A sua aplicação tem de ter uma classe Main que inicie um servidor Web que responda a pedidos HTTP na porta 8080, que pode ser especificada pela variável de ambiente PORT.

Por 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 de WAR (Java 11)

As instruções seguintes demonstram como reempacotar uma aplicação Java 8 do App Engine hello-world como um JAR para ser executado no tempo de execução do Java 11.

A migração usa o artefacto appengine-simple-jetty-main. Isto fornece uma classe Main com um servidor Web Jetty simples que carrega um ficheiro WAR e inclui a sua app num ficheiro JAR executável:

  1. Clone o artefacto do servidor Jetty incorporado para a sua máquina local:

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

    Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.

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

    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 ficheiro pom.xml do seu projeto:

    • appengine-simple-jetty-main dependência:
      <dependency>
        <groupId>com.example.appengine</groupId>
        <artifactId>simple-jetty-main</artifactId>
        <version>1</version>
        <scope>provided</scope>
      </dependency>
    • maven-dependency plugin:
      <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 implementa ficheiros localizados no diretório ${build.directory}/appengine-staging. Ao adicionar o plugin maven-dependency à sua compilação, o App Engine instala as dependências especificadas na pasta correta.
  5. Crie um elemento entrypoint no seu ficheiro app.yaml para chamar o objeto appengine-simple-jetty-main e transmita o seu ficheiro WAR como um argumento. Por exemplo, veja o ficheiro de helloworld-servletexemplo app.yaml:

    runtime: java11
    entrypoint: 'java -cp "*" com.example.appengine.jetty.Main helloworld.war'
  6. Para executar a sua aplicação localmente:

    1. Empacote a sua aplicação:

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

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

      mvn exec:java -Dexec.args="../helloworld-java8/target/helloworld.war"
      
    3. No navegador de Internet, introduza o seguinte endereço:

      http://localhost:8080

  7. Para implementar a sua aplicação:

    Ferramentas gcloud

    gcloud app deploy

    Plugin Maven

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

    Substitua PROJECT_ID pelo ID do seu Google Cloud projeto. Se o seu ficheiro pom.xmlespecificar o seu ID do projeto , não precisa de incluir a propriedade -Dapp.deploy.projectId no comando que executa.