WAR 파일을 JAR 파일로 다시 패키징

지원되는 최신 자바 버전으로 마이그레이션하고 앱에서 기존 번들 서비스를 사용하지 않는 경우 App Engine 자바 8 웹 애플리케이션을 실행 가능한 JAR 파일로 다시 패키징해야 합니다.

애플리케이션에는 PORT 환경 변수로 지정될 수 있는 포트 8080에서 HTTP 요청에 응답하는 웹 서버를 시작하는 Main 클래스가 있어야 합니다.

예를 들면 다음과 같습니다.

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 마이그레이션 예시(자바 11)

다음 안내에서는 자바 11 런타임에서 실행할 App Engine 자바 8 hello-world 애플리케이션을 JAR로 다시 패키징하는 방법을 보여줍니다.

마이그레이션은 appengine-simple-jetty-main 아티팩트를 사용합니다. 이는 WAR 파일을 로드하고 앱을 실행 가능한 JAR 파일로 패키징하는 간단한 Jetty 웹 서버가 포함된 Main 클래스를 제공합니다.

  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 디렉터리에 있는 파일을 배포합니다. App Engine은 빌드에 maven-dependency 플러그인을 추가하여 지정된 종속 항목을 올바른 폴더에 설치합니다.
  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 속성을 포함하지 않아도 됩니다.