자바 8/Jetty 9 런타임

자바 8/Jetty 9 런타임은 자바 서블릿 3.1 사양을 지원하는 OpenJDK 8 및 Eclipse Jetty 9를 제공합니다. 이 런타임의 특정 Jetty 버전에 대한 자세한 내용은 GitHub 프로젝트의 Jetty 속성에서 런타임의 이미지를 참조하세요.

기본 요건

  • Google Cloud SDK의 최신 버전을 다운로드하거나 Cloud SDK를 최신 버전으로 업데이트합니다.

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

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.2.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]

app.yaml

app.yaml 파일은 필수 항목입니다. 이러한 형태의 파일을 정의하세요.

runtime: java
env: flex

handlers:
- url: /.*
  script: this field is required, but ignored

WAR(*.war 파일)를 배포할 때 런타임 이미지 gcr.io/google-appengine/jetty가 자동으로 선택됩니다.

이 이미지를 커스텀 런타임의 기본으로 사용하려면 app.yaml 파일에 runtime: custom을 지정한 후 다음과 같이 Dockerfile을 작성하면 됩니다.

FROM gcr.io/google-appengine/jetty
ADD your-application.war $APP_DESTINATION

이 줄은 Docker 컨테이너의 올바른 위치에 WAR을 추가합니다.

다른 app.yaml 설정은 app.yaml 사용에 설명되어 있습니다.

pom.xml은 Maven을 구성하는 데 사용되고 build.gradle은 Gradle을 구성하는 데 사용됩니다.

선택적 파일

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

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

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

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

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

gzip 압축 사용

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

env_variables:
  JETTY_MODULES_ENABLE: 'gzip'

빠른 시작 사용

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

FROM launcher.gcr.io/google/jetty
ADD your-application.war $JETTY_BASE/webapps/root.war

# generate quickstart-web.xml
RUN /scripts/jetty/quickstart.sh

환경 변수

자바 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 SDK를 초기화하려면 다음을 실행합니다.

gcloud init

구성을 완료한 후 Google Cloud SDK에서 다음을 사용하여 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를 Cloud 프로젝트의 ID로 바꿉니다. pom.xml 파일에 이미 프로젝트 ID가 지정된 경우 실행할 명령어에 -Dapp.deploy.projectId 속성을 포함하지 않아도 됩니다.

Gradle

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

gradle appengineDeploy

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

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

Dockerfile은 다음과 같이 시작합니다.

FROM gcr.io/google-appengine/jetty
ADD your-application.war $APP_DESTINATION
# YOUR DOCKER COMMANDS

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