Java 런타임

Java 런타임은 애플리케이션 코드 및 종속 항목을 설치한 후 가변형 환경에서 해당 애플리케이션을 실행하는 소프트웨어 스택입니다.

  • 11 이상 버전은 빌드팩을 사용하여 빌드되므로 app.yaml 파일에서 운영체제를 선택해야 합니다. 예를 들어 Java 21을 사용하려면 Ubuntu 22를 운영체제로 지정해야 합니다.

  • Java 8/Jetty 9 런타임은 Java 서블릿 3.1 사양을 지원하는 OpenJDK 8 및 Eclipse Jetty 9를 제공합니다. Jetty 이미지는 OpenJDK 이미지를 넘겨받습니다.

지원되는 Java 버전의 전체 목록과 해당 Ubuntu 버전은 런타임 지원 일정을 참조하세요.

기본 요건

Java 런타임을 사용하려면 다음 안내를 따르세요.

  • gcloud CLI 버전 420.0.0 이상을 설치해야 합니다. gcloud components update 명령어를 실행하여 CLI 도구를 업데이트할 수 있습니다. 설치된 버전을 보려면 gcloud version 명령어를 실행하면 됩니다.

  • Maven을 사용하여 배포하려면 pom.xmlApp Engine Maven 플러그인을 추가해야 합니다.

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.7.0</version>
    </plugin>

    gcloud app deploy 명령어 또는 App Engine Gradle 플러그인을 포함한 다른 배포 옵션도 있습니다.

파일 정리

소스 트리는 다음과 같은 형태입니다.

MyDir/
  [pom.xml]
  [build.gradle]
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    docker/
      [Dockerfile]
    java/
      com.example.mycode/
        MyCode.java
    webapp/
      [index.html]
      [jsp.jsp]
      WEB-INF/
        [web.xml]

Java 버전 선택

새 런타임 버전

Java 런타임 버전 11 이상의 경우 app.yaml 파일에 runtime_configoperating_system 설정을 포함하여 운영체제를 지정해야 합니다.

선택사항으로 app.yaml 파일에 runtime_version 설정을 포함하여 런타임 버전을 지정할 수 있습니다. runtime_version 설정이 지정되지 않으면 기본적으로 최신 Java 버전이 사용됩니다.

예시

  • Ubuntu 22에서 Java 21을 지정하려면 다음 안내를 따르세요.

    runtime: java
    env: flex
    
    runtime_config:
        operating_system: "ubuntu22"
        runtime_version: "21"
    
  • Ubuntu 22에서 지원되는 최신 Java 버전을 지정하려면 다음 안내를 따르세요.

      runtime: java
      env: flex
    
      runtime_config:
          operating_system: "ubuntu22"
    

이전 런타임 버전

Java 8의 경우 app.yaml 파일에 runtime_configjdk 설정을 지정합니다.

Java 8은 다음을 지원합니다.

  • Eclipse Jetty 9 런타임은 서블릿 3.1을 사용하여 Jetty 9을 실행합니다.
  • 애플리케이션의 일부로 포트 8080에서 리슨하는 자체 서버 코드입니다. 이 기능을 사용하면 SparkJavaSpring-Boot 등의 마이크로서비스 프레임워크를 사용할 수 있습니다.

예시

  • Jetty 버전 9 지정하기(기본값/선택사항)

      runtime_config:
        jdk: openjdk8
        server: jetty9
    
  • Java 버전 8 지정하기

      runtime_config:
        jdk: openjdk8
    
  • Java 8용 샘플 app.yaml

    runtime: java
    env: flex
    
    handlers:
    - url: /.*
      script: this field is required, but ignored

Maven 구성은 pom.xml을, Gradle 구성은 build.gradle을 참조하세요.

선택적 파일

다음 구성 파일은 선택사항입니다.

이 파일을 최상위 수준 MyDir에 배치하세요. 이러한 파일을 사용하는 경우 gcloud app deploy 명령어를 사용하여 별도로 배포해야 합니다.

web.xml은 선택사항이며 Servlet 3.x 주석을 사용하지 않는 경우에만 필요합니다.

JavaServer 페이지뿐만 아니라 정적 웹 콘텐츠도 webapp/ 디렉터리에 배치할 수 있습니다. App Engine 가변형 환경에서 서블릿 컨테이너로 사용되는 Jetty 9Apache Jasper를 기본 JSP 구현으로 사용하며 JSTL taglib을 포함합니다.

Dockerfile 파일은 선택사항이며 Java 런타임을 사용자 설정하는 데 사용됩니다.

gzip 압축 사용

gzip 핸들러는 Jetty와 함께 번들로 제공되지만 기본적으로 활성화되지 않습니다. 이 모듈을 활성화하려면 app.yaml 파일에서 환경 변수 JETTY_MODULES_ENABLE=gzip를 설정합니다.

env_variables:
  JETTY_MODULES_ENABLE: 'gzip'

빠른 시작 사용

Jetty는 내용을 미리 스캔하고 구성 파일을 생성하여 애플리케이션 시작 시간을 단축할 수 있습니다. 확장된 이미지를 사용하는 경우 애플리케이션 WAR이 추가된 후 Dockerfile에서 /scripts/jetty/quickstart.sh를 실행하여 빠른 시작을 활성화할 수 있습니다.

환경 변수

Java 8/Jetty 9 런타임과 관련하여 다음과 같은 선택적 환경 변수를 설정할 수 있습니다. OpenJDK 8 환경 변수도 설정할 수 있습니다.

환경 변수를 설정하려면 app.yaml 파일에서 env_variables 키를 사용하세요.

환경 변수 Maven 속성 값/설명
JETTY_PROPERTIES $JETTY_ARGS에 추가된 쉼표로 구분된 name=value 쌍의 목록
JETTY_MODULES_ENABLE $JETTY_ARGS에 추가하여 사용 설정할 쉼표로 구분된 모듈의 목록
JETTY_MODULES_DISABLE $JETTY_BASE/start.d에서 삭제하여 사용 중지할 쉼표로 구분된 모듈의 목록
JETTY_ARGS jetty의 start.jar에 전달된 인수. 커스텀 설정 jetty 구성에 사용되는 인수는 여기로 전달됩니다.
JAVA_OPTS JVM 런타임 인수

향상된 Cloud Logging(베타)

App Engine flex 환경에서 실행하는 경우 JETTY_ARGS 환경 변수를 설정하여 Cloud Logging에 로그를 전송하도록 Java Util Logging을 구성할 수 있습니다. 예를 들면 다음과 같습니다.

 env_variables:
   JETTY_ARGS: -Djava.util.logging.config.file=WEB-INF/logging.properties

다음과 같이 LoggingHandler를 구성하는 logging.properties 파일을 제공해야 합니다.

handlers=com.google.cloud.logging.LoggingHandler

# Optional configuration
.level=INFO
com.google.cloud.logging.LoggingHandler.level=FINE
com.google.cloud.logging.LoggingHandler.log=gae_app.log
com.google.cloud.logging.LoggingHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%3$s: %5$s%6$s

로컬 테스트

로컬 환경에서 테스트할 때 원격 Google Cloud 서비스 대신 에뮬레이션된 Google Cloud 서비스를 사용할 수 있습니다. 다음 에뮬레이터를 사용할 수 있습니다.

앱을 실행하기 전에 gcloud 명령어를 사용하여 시작합니다.

gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start

Maven

Maven pom.xml 파일에 다음 줄을 추가하여 Jetty 9 Maven 플러그인을 추가합니다.

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>9.4.2.v20170220</version>
</plugin>

앱을 로컬에서 실행하려면 Maven 명령어를 사용하세요.

mvn jetty:run-exploded

Gradle

새 Gradle 프로젝트 만들기의 안내를 따라 Gretty Gradle 플러그인build.gradle에 추가하고 다음 명령어를 사용합니다.

gradle jettyRun

앱 배포

Google Cloud CLI를 초기화하려면 다음을 실행합니다.

gcloud init

구성을 완료한 후 Google Cloud CLI에서 다음을 사용하여 app.yaml 및 WAR 파일이 포함된 이 디렉터리를 배포할 수 있습니다.

gcloud app deploy app.yaml

선택적 구성 파일(index.yaml, cron.yaml, dispatch.yaml)을 사용하는 경우 gcloud 명령어를 사용하여 별도로 배포합니다. 예를 들면 다음과 같습니다.

gcloud app deploy cron.yaml

Maven

Maven을 사용하여 앱을 배포합니다.

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

PROJECT_ID를 Google Cloud 프로젝트의 ID로 바꿉니다. pom.xml 파일에 이미 프로젝트 ID가 지정된 경우 실행할 명령어에 -Dapp.deploy.projectId 속성을 포함하지 않아도 됩니다.

Gradle

Gradle을 사용하여 앱을 배포합니다.

gradle appengineDeploy

Java 8/Jetty 9 런타임 사용자 설정

앱을 Java 8/Jetty 9 런타임에 배포하는 데는 Dockerfile이 필요하지 않습니다. 앱에 추가 구성이 필요하면 Dockerfile을 명시적으로 제공하여 Java 런타임을 사용자 설정하면 됩니다. Dockerfile에는 기본 이미지가 포함되어야 합니다. Dockerfile에 추가 지시문을 더하여 Java 런타임을 맞춤설정할 수 있습니다. 커스텀 런타임 빌드를 참조하세요.

이 경우 your-application.wartarget/ 디렉터리(maven) 또는 build/staged-app/(gradle)에 빌드된 WAR 파일의 이름입니다.