將 WAR 檔案重新封裝成 JAR 檔案

如果您要遷移至最新的支援 Java 版本,且應用程式不會使用舊版套裝服務,則必須將 App Engine Java 8 網路應用程式重新封裝為可執行的 JAR 檔案。

您的應用程式必須有 Main 類別,啟動網路伺服器,以便回應通訊埠 8080 的 HTTP 要求,該通訊埠可能由 PORT 環境變數指定。

例如:

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

WAR 遷移範例 (Java 11)

以下操作說明示範如何將 App Engine Java 8 hello-world 應用程式重新包裝為 JAR,以便在 Java 11 執行階段上執行。

遷移作業會使用 appengine-simple-jetty-main 構件。這會提供 Main 類別,其中含有簡單的 Jetty 網路伺服器,可載入 WAR 檔案,並將應用程式封裝至可執行的 JAR 檔案:

  1. 將內嵌 Jetty 伺服器構件複製到本機電腦:

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

    您也可以下載 zip 格式的範例,然後解壓縮該檔案。

  2. 變更為包含範例程式碼的目錄:

    cd java-docs-samples/appengine-java11/appengine-simple-jetty-main/
    
  3. 在本機安裝依附元件:

    mvn install
    
  4. 在專案的 pom.xml 檔案中加入下列程式碼:

    • appengine-simple-jetty-main 依附元件:
      <dependency>
        <groupId>com.example.appengine</groupId>
        <artifactId>simple-jetty-main</artifactId>
        <version>1</version>
        <scope>provided</scope>
      </dependency>
    • 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 會部署位於 ${build.directory}/appengine-staging 目錄中的檔案。將 maven-dependency 外掛程式新增至建構作業,App Engine 就會將您指定的依附元件安裝至正確的資料夾。
  5. app.yaml 檔案中建立 entrypoint 元素,以便呼叫 appengine-simple-jetty-main 物件,並將 WAR 檔案做為引數傳遞。例如,請參閱 helloworld-servlet 範例 app.yaml 檔案:

    runtime: java11
    entrypoint: 'java -cp "*" com.example.appengine.jetty.Main helloworld.war'
  6. 如何在本機上執行應用程式:

    1. 封裝應用程式:

      mvn clean package
      
    2. 使用 WAR 檔案做為引數來啟動伺服器。

      舉例來說,您可以從 java-docs-samples/appengine-java11/appengine-simple-jetty-main/ 資料夾執行下列指令,在 helloworld-servlet 範例中啟動伺服器:

      mvn exec:java -Dexec.args="../helloworld-java8/target/helloworld.war"
      
    3. 在網路瀏覽器中,輸入下列網址:

      http://localhost:8080

  7. 如要部署您的應用程式:

    gcloud 工具

    gcloud app deploy

    Maven 外掛程式

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

    PROJECT_ID 替換為您的 Google Cloud 專案 ID。如果 pom.xml 檔案已指定專案 ID,您執行的指令中就不需要加入 -Dapp.deploy.projectId 屬性。