REGION_ID는 앱을 만들 때 선택한 리전을 기준으로 Google에서 할당하는 축약된 코드입니다. 일부 리전 ID는 일반적으로 사용되는 국가 및 주/도 코드와 비슷하게 표시될 수 있지만 코드는 국가 또는 주/도와 일치하지 않습니다. 2020년 2월 이후에 생성된 앱의 경우 REGION_ID.r이 App Engine URL에 포함됩니다. 이 날짜 이전에 만든 기존 앱의 경우 URL에서 리전 ID는 선택사항입니다.
기존 앱을 App Engine 자바 8 런타임에서 지원되는 최신 자바 버전으로 기존 앱을 마이그레이션하려고 기존 번들 서비스를 사용하려는 경우에만 앱 구성에 appengine-web.xml 파일을 사용해야 합니다.
프로젝트에서 appengine-web.xml을 사용하는 경우 app.yaml은 배포 시 자동으로 생성됩니다.
App Engine Java 애플리케이션은 appengine-web.xml이라는 구성 파일을 사용하여 앱에 대한 정보를 지정하고 앱의 WAR 파일에서 이미지와 같은 정적 파일이 무엇인지 식별하고 애플리케이션에서 사용되는 리소스 파일을 식별합니다.
구문
App Engine Java 앱에는 appengine-web.xml 디렉터리의 WAR에 WEB-INF/이라는 파일이 있어야 합니다. 이 파일은 루트 요소가 <appengine-web-app>인 XML 파일입니다.
appengine-web.xml에 대한 문서 유형 정의와 스키마 사양은 SDK의 docs/ 디렉터리에서 찾을 수 있습니다.
요소
설명
<application>
gcloud app deploy 명령어, IntelliJ 또는 Eclipse 플러그인, Maven 또는 Gradle 플러그인과 같은 Google Cloud SDK 기반 도구를 사용하여 앱을 배포하는 경우에는 필요하지 않습니다. Google Cloud SDK 기반 도구는 이 요소를 무시하고 gcloud config 프로젝트 속성에서 프로젝트 ID를 가져옵니다. gcloud 명령줄 도구를 사용하여 프로젝트 ID를 재정의할 수는 있지만 이렇게 하면 머신 전체 프로젝트 ID가 설정되므로, 여러 프로젝트 개발 시에 혼란이 야기될 수 있습니다.
<application> 요소는 애플리케이션의 프로젝트 ID를 포함합니다. 이 프로젝트 ID는 Google Cloud console에서 프로젝트를 만들 때 등록하는 프로젝트 ID입니다.
선택사항.
애플리케이션이 HTTP 세션 데이터를 Datastore에 비동기식으로 쓰도록 구성하여 요청 지연 시간을 줄일 수 있습니다.
<async-session-persistenceenabled="true"/>
비동기 세션 지속성을 사용하면 App Engine은 데이터를 Memcache에 쓰기 전에 세션 데이터를 Datastore에 쓰는 태스크 큐 태스크를 제출합니다.
기본적으로 태스크는 `default` 큐에 제출됩니다. 다른 큐를 사용하려면 `queue-name` 속성을 추가합니다.
세션 데이터는 항상 동기식으로 Memcache에 기록됩니다. memcache를 사용할 수 없을 때(또는 세션 데이터가 비워졌을 때) 요청이 세션 데이터를 읽으려고 시도하면, 아직 최신 세션 데이터가 포함되지 않을 수 있는 Datastore로 장애 조치됩니다. 이는 비동기 세션 지속성으로 인해 애플리케이션에 비활성 세션 데이터가 보일 수 있음을 의미합니다. 그러나 대부분 애플리케이션의 경우, 지연 시간의 이점이 이러한 위험을 훨씬 능가합니다.
<auto-id-policy>
선택사항. 항목 식별자를 자동으로 설정하는 경우, 자동 ID 정책을 설정하여 사용되는 방법을 변경할 수 있습니다. 유효한 옵션은 다음과 같습니다.
default
기본값. 64비트 부동 소수점으로 표시될 수 있을 만큼 작고 적절하게 분포된 큰 정수인 분산형 자동 ID를 사용합니다.
참고: 서비스의 이전 명칭은 '모듈'이며 appengine-web.xml 파일에서 서비스는 계속해서 모듈로 선언됩니다. 예를 들면 <module>service_name</module>입니다.
서비스를 만들 경우 필수 항목입니다. 기본 서비스의 경우에는 선택사항입니다.
각 서비스와 버전에는 이름이 있어야 합니다. 이름에는 숫자, 문자, 하이픈이 포함될 수 있습니다. 63자(영문)를 초과할 수 없으며 하이픈으로 시작하거나 끝날 수 없고 문자열 `-dot`를 포함할 수 없습니다. 각 서비스와 버전에 고유한 이름을 선택하세요. 서비스와 버전 간에 이름을 재사용하지 마세요.
선택사항.
<public-root>는 애플리케이션의 정적 파일이 포함된 애플리케이션의 디렉터리입니다. 정적 파일에 대한 요청이 실행되면 요청 경로 앞에 애플리케이션의 <public-root>가 추가됩니다. 이에 따라 요청된 콘텐츠가 있는 애플리케이션 파일 경로가 제공됩니다.
<public-root>의 기본값은 /입니다.
예를 들어 다음은 URL 경로 /index.html을 애플리케이션 파일 경로 /static/index.html로 매핑합니다.
<public-root>/static</public-root>
<resource-files>
선택사항. <resource-files> 요소에 나열된 파일은 파일 시스템을 사용하여 애플리케이션 코드에 액세스할 수 있습니다. 이러한 파일은 정적 파일을 저장하고 제공하는 방식과 달리 앱과 함께 애플리케이션 서버에 저장됩니다.
<resource-files> 요소는 다음 요소를 포함할 수 있습니다.
<include>
<include> 요소는 파일을 리소스 파일로 지정하며 애플리케이션 코드에서 사용될 수 있습니다. 이 파일은 트래픽 서비스 제공이 아닌 읽기 전용으로만 코드에서 사용될 수 있습니다.
파일 포함 및 제외.
<exclude>
<exclude> 패턴과 일치하는 파일 및 디렉터리는 애플리케이션 코드에 업로드하거나 사용할 수 없습니다. 단, 로컬 개발 서버에서 실행하는 경우에는 이러한 파일과 디렉터리는 애플리케이션에 계속 액세스할 수 있습니다. 자세한 내용은 파일 포함 및 제외를 참조하세요.
이 예시는 feeds/ 디렉터리와 해당 하위 디렉터리의 파일을 제외하고 모든 .xml 파일을 리소스 파일로 지정하는 방법을 보여줍니다.
App Engine 리소스 파일은 java.io.File 또는 javax.servlet.ServletContext.getResource/getResourceAsStream을 사용하여 읽습니다.
이들은 Class.getResourceAsStream()을 통해 액세스할 수 없습니다.
선택사항.
App Engine에는 서블릿 세션 인터페이스를 사용하여 구현된 세션이 포함됩니다.
이 구현은 지속성을 위해 Datastore의 세션 데이터를 저장하며 속도를 높이기 위해 Memcache도 사용합니다. 대부분의 다른 서블릿 컨테이너와 마찬가지로, 요청 중에 `session.setAttribute()`로 설정된 세션 속성은 요청이 끝날 때까지 지속됩니다.
이 기능은 기본적으로 사용 중지되어 있습니다. 이 기능을 사용 설정하려면 appengine-web.xml에 다음을 추가하세요.
예시:
<sessions-enabled>true</sessions-enabled>
이 구현은 _ah_SESSION 종류의 Datastore 항목과 프리픽스가 _ahs인 키를 사용하여 Memcache 항목을 만듭니다. 이러한 항목은 Dataflow 템플릿을 사용하여 삭제할 수 있습니다.
참고: App Engine은 Datastore와 Memcache에 세션 데이터를 저장하므로, 세션에 저장된 모든 값은 java.io.Serializable 인터페이스를 구현해야 합니다.
선택사항.
기본적으로 모든 사용자는 HTTP 또는 HTTPS를 사용하여 모든 URL에 액세스할 수 있습니다.
사용자는 배포 설명자의 특정 URL에 대해 HTTPS를 요구하도록 앱을 구성할 수 있습니다. 배포 설명자: 보안 URL을 참조하세요.
애플리케이션에 HTTPS 사용을 허용하지 않으려면 appengine-web.xml 파일에 다음을 추가합니다.
<ssl-enabled>false</ssl-enabled>
Java 런타임 환경에서 일부 URL 경로에 대해서만 HTTPS를 허용하지 않는 방법은 없습니다.
<static-error-handlers>
선택사항.
특정 오류가 발생하면 App Engine은 일반 오류 페이지를 제공합니다. 커스텀 오류 데이터가 10KB 미만인 경우, 이러한 일반 오류 페이지 대신 커스텀 정적 파일을 제공하도록 앱을 구성할 수 있습니다. 앱의 appengine-web.xml 파일에 여러 파일을 지정하여 지원되는 각 오류 코드에 대해 제공할 다양한 정적 파일을 설정할 수 있습니다. 커스텀 오류 페이지를 제공하려면 이 예시와 같이 appengine-web.xml에 <static-error-handlers> 섹션을 추가합니다.
error-code는 선택사항입니다. 지정하지 않으면 제공된 파일이 앱의 기본 오류 응답이 됩니다.
커스텀 오류를 처리할 때 사용할 mime-type을 선택사항으로 지정할 수 있습니다. MIME 유형의 전체 목록을 참조하세요.
<static-files>
선택사항.
<static-files> 요소는 정적 파일 목록에 포함하거나 해당 목록에서 제외할 파일 경로와 일치하는 패턴을 지정하여 기본 동작을 재정의하거나 수정합니다. 정적 파일은 애플리케이션 서버와는 별도의 전용 서버 및 캐시에서 제공되고 이미지, CSS 스타일시트 또는 자바스크립트 파일과 같은 정적 콘텐츠를 제공하는 데 유용합니다.
<static-files> 요소는 다음 요소를 포함할 수 있습니다.
<include>
<include> 요소는 모든 비JSP 파일을 포함하는 기본 동작을 재정의합니다. <include> 요소는 지정된 리소스에 대한 요청 응답 시에 사용할 HTTP 헤더를 지정할 수 있습니다. 자세한 내용은 파일 포함 및 제외를 참조하세요.
include 요소에 expiration 속성을 지정하여 기본 정적 캐시 만료 시간을 재정의할 수 있습니다.
값은 공백으로 구분된 숫자와 단위 문자열입니다. 단위는 d(일), h(시간), m(분), s(초)일 수 있습니다. 예를 들어 "4d 5h"는 파일이 처음 요청된 후 4일 5시간으로 캐시 만료 시간을 설정합니다.
자세한 내용은 캐시 만료를 참조하세요.
<exclude>
앱을 App Engine에 배포하면 <exclude> 패턴과 일치하는 파일과 디렉터리는 업로드되지 않습니다. 단, 로컬 개발 서버에서 실행하는 경우에는 이러한 파일과 디렉터리는 애플리케이션에 계속 액세스할 수 있습니다. 자세한 내용은 파일 포함 및 제외를 참조하세요.
기본값은 native이며, 이는 표준 Java 네트워크 클래스가 표준 Java HTTP(S) 전송을 사용함을 의미합니다.
이 설정을 사용하려면 앱에서 결제를 사용 설정해야 합니다. 그렇지 않으면 발행 요청에 설명된 것처럼 예외가 발생합니다.
url-stream-handler를 urlfetch로 설정하면 URL.openConnection 및 관련 메서드가 http 및 https 전송에 URL 가져오기를 사용합니다.
<url-stream-handler>urlfetch</url-stream-handler>
<version>
<version> 요소에는 앱 코드의 최신 버전에 대한 버전 식별자가 포함됩니다. 버전 식별자는 소문자, 숫자, 하이픈을 포함할 수 있습니다. 프리픽스 'ah-'로 시작될 수 없으며, 'default'와 'latest' 이름은 예약된 이름이므로 사용될 수 없습니다.
항상 숫자로 지정되는 숫자 인스턴스와 구분되도록 버전 이름은 문자로 시작되어야 합니다. 이렇게 하면 123.my-module.uc.r.appspot.com과 같이 2가지로 해석될 수 있는 URL의 모호성을 방지할 수 있습니다. 즉, URL에 버전 '123'이 있으면 대상은 제공된 모듈의 버전 '123'이 됩니다. 해당 버전이 존재하지 않으면 타겟팅은 모듈 기본 버전의 123번 인스턴스입니다.
<warmup-requests-enabled>
선택사항. 기본값은 true입니다. 준비 요청은 기본적으로 Java 애플리케이션에서 사용 설정됩니다.
준비 요청이 사용 설정되면 App Engine 인프라는 /_ah/warmup에 `GET` 요청을 보내 <load-on-startup> 서블릿, ServletContextListeners, 커스텀 준비 서블릿을 초기화합니다. 따라서 애플리케이션 코드를 필요에 따라 초기화할 수 있습니다.
선택한 방법에 따라 /_ah/warmup에 대한 고유한 핸들러를 구현해야 할 수도 있습니다.
선택사항. 달리 지정되지 않는 한 기본적으로 자동 확장에는 기본 인스턴스 클래스 F1이 사용됩니다.
automatic_scaling 요소는 모듈의 인스턴스 수, 지연 시간, 동시 연결에 대한 최소 및 최대 수준을 설정합니다.
이 요소는 다음 요소를 포함할 수 있습니다.
<target-cpu-utilization>
선택사항. 0.5에서 0.95 사이의 값을 지정합니다.
이 매개변수는 트래픽 처리를 위해 새 인스턴스가 시작되는 CPU 사용량 기준점을 지정합니다. 이렇게 하면 성능과 비용 간의 균형을 유지할 수 있습니다. 값을 낮추면 성능과 비용이 높아지고, 값을 높이면 성능이 낮아지지만 비용도 낮아집니다. 예를 들어 값이 0.7이면 CPU 사용량이 70%에 도달한 후 새 인스턴스가 시작됩니다.
<target-throughput-utilization>
선택사항. 0.5에서 0.95 사이의 값을 지정합니다.
동시 요청으로 인해 새 인스턴스가 시작되는 경우를 지정하기 위해 max-concurrent-requests과 함께 사용됩니다. 동시 요청 수가 max-concurrent-requests와 target-throughput-utilization을 곱한 값에 도달하면 스케줄러는 새 인스턴스를 시작합니다.
<max-instances>
선택사항. 이 애플리케이션 버전에 대해 App Engine이 만들 수 있는 최대 인스턴스 수입니다. 이 값은 모듈 비용을 제한하는 데 유용합니다. 0에서 2147483647 사이의 값을 지정합니다.
<min-instances>
선택사항. 이 모듈 버전에 대해 App Engine이 만들 수 있는 최소 인스턴스 수입니다. 이러한 인스턴스는 요청이 도착했을 때 트래픽을 처리하고 트래픽 처리를 위해 추가 인스턴스가 시작되었을 때도 계속 트래픽을 처리합니다.
0에서 1,000 사이의 값을 지정합니다. 매개변수를 값 0으로 설정하면 요청이 처리되지 않을 때 비용 절감을 위해 인스턴스를 0개로 조정할 수 있습니다. 트래픽 수신 여부에 관계없이 지정된 인스턴스 수에 따라 비용이 청구됩니다.
<max-concurrent-requests>
선택사항. 스케줄러가 새 인스턴스를 만들기 전에 자동 확장 인스턴스가 수락할 수 있는 동시 요청 수입니다(기본값: 10, 최대값: 80).
이 설정이 너무 높으면 API 지연 시간이 늘어날 수 있습니다. 스케줄러는 실제 최대 요청 수에 도달하기 전에 새 인스턴스를 생성할 수 있습니다.
참고:instance-class가 F2 이상으로 설정되면 max-concurrent-requests를 기본값인 10보다 큰 값으로 설정하여 인스턴스를 최적화할 수 있습니다.
최적 값을 찾으려면 값을 점차적으로 늘리면서 애플리케이션 성능을 모니터링하세요.
<max-idle-instances>
이 버전에 대해 App Engine이 유지해야 하는 최대 유휴 인스턴스 수입니다. 기본값은 'automatic'입니다.
다음 사항에 유의하세요.
최댓값이 높으면 부하 수준이 급상승 이후 정상으로 돌아갈 때 유휴 인스턴스 수가 보다 점진적으로 줄어듭니다. 이렇게 하면 요청 부하가 변동되더라도 애플리케이션이 성능을 안정적으로 유지할 수 있지만 높은 부하 기간 중에 유휴 인스턴스 수가 증가하므로 실행 비용도 늘어납니다.
최댓값이 낮으면 실행 비용이 낮아지지만 부하 수준의 변동 폭이 클 때 성능이 저하될 수 있습니다.
참고: 부하 급증 후 정상 수준으로 다시 조정될 때는 유휴 인스턴스 수가 사용자가 지정한 최댓값을 일시적으로 초과할 수 있습니다. 하지만 사용자가 지정한 최대 개수를 초과하는 인스턴스에 대해서는 비용이 청구되지 않습니다.
<max-pending-latency>
대기 지연 시간이 감소되도록 요청 처리를 위해 추가 인스턴스를 시작하기 전에 App Engine이 대기 큐에서 요청에 허용해야 하는 최대 대기 시간입니다.
최대값이 낮으면 App Engine이 대기 중인 요청에 대해 새 인스턴스를 더 빠르게 시작하므로, 성능이 향상되지만 실행 비용도 높아집니다.
최댓값이 높으면 (대기 중인 요청이 있지만 이를 처리할 유휴 인스턴스가 없는 경우) 요청을 처리하는 데 오래 기다려야 할 수 있지만 애플리케이션 실행 비용은 낮아집니다.
<min-idle-instances>
실행 상태로 유지되고 트래픽을 처리할 수 있는 인스턴스 수입니다. 이 설정은 트래픽을 가장 많이 수신하는 버전에만 적용됩니다. 다음 사항에 유의하세요.
최솟값이 낮으면 유휴 기간 중의 실행 비용이 낮아지지만, 갑작스러운 부하 증가에 대응하기 위해 즉시 사용할 수 있는 인스턴스 수가 부족할 수 있습니다.
최솟값이 높으면 요청 부하가 급증하더라도 애플리케이션을 우선적으로 처리할 수 있습니다. App Engine은 들어오는 요청을 처리하기 위해 실행 중인 최소 인스턴스 수를 유지합니다. 요청 처리 여부에 관계없이 인스턴스에 대한 요금은 청구됩니다. 이 기능이 올바르게 작동하기 위해서는 준비 요청이 사용 설정되었고 애플리케이션이 준비 요청을 처리할 수 있는지 확인해야 합니다.
유휴 인스턴스의 최소 개수를 설정하면, 대기 지연 시간이 애플리케이션 성능에 영향을 덜 줍니다.
App Engine은 유휴 인스턴스를 예약된 상태로 유지하므로, 부하가 매우 크게 증가하는 경우를 제외하고 요청이 대기 중인 큐에 진입할 가능성이 낮습니다. 예약 상태로 유지할 이상적인 인스턴스 수를 결정하려면 애플리케이션과 예상 트래픽 볼륨을 테스트해야 합니다.
<min-pending-latency>
App Engine이 요청 처리를 위해 새 인스턴스를 시작하기 전에 대기 중인 대기열에서 요청 대기 시간을 허용하는 최소 시간(초)입니다. 0.01에서 15 사이의 값을 지정합니다.
최소값이 낮으면 기존의 모든 인스턴스가 활성화 상태인 경우에 요청이 대기 중인 대기열에 있어야 하는 시간이 줄어듭니다. 따라서 성능은 향상되지만 애플리케이션 실행 비용이 증가합니다.
최솟값이 높으면 기존의 모든 인스턴스가 활성화 상태인 경우에 요청이 대기 중 상태로 유지되는 시간이 늘어납니다. 따라서 실행 비용은 낮아지지만 요청 처리를 위해 사용자가 기다려야 하는 시간이 늘어납니다.
배포 중에 수행되는 대부분의 작업은 스테이징이라 하는 준비 단계에서 로컬로 수행되며, 이 과정에서 JAR 파일 어셈블, JSP 컴파일 등의 작업이 수행됩니다.
선택사항으로 애플리케이션 구성 파일의 스테이징 요소를 사용하여 스테이징 동작의 특정 부분을 구성할 수 있습니다. 대부분의 애플리케이션은 스테이징 동작을 수동으로 구성하지 않고도 성공적으로 배포됩니다. 앱이 배포되지 않는 경우, 아래에 있는 옵션을 사용하여 스테이징을 구성해야 할 수도 있습니다.
요소
설명
<staging>
선택사항. 대부분의 애플리케이션은 기본 동작을 변경할 필요가 없습니다.
스테이징 요소를 사용하면 배포를 위해 필요한 경우에 특정 스테이징 구성을 지정할 수 있습니다.
이 요소에는 다음 요소가 포함될 수 있습니다.
<enable-jar-splitting>
선택사항. 큰 Jar 파일(10MB 초과)을 작은 조각으로 분할합니다.
(기본값: true).
<jar-splitting-excludes>
쉼표로 구분된 파일 서픽스 목록을 지정합니다.
enable-jar-splitting이 사용 설정된 경우 서픽스가 일치하는 모든 파일이 모든 JAR에서 제외됩니다.
스테이징 옵션의 기본값은 gcloud CLI와 같은 Google Cloud SDK 기반 도구 또는 Google Cloud SDK 기반 Maven, Gradle, Eclipse, IntelliJ 플러그인 사용 여부에 따라 다릅니다.
스테이징 요소
App Engine SDK 기반 기본값
Google Cloud SDK 기반 기본값
enable-jar-splitting
false
true
jar-splitting-excludes
해당 없음
해당 없음
disable-jar-jsps
false
false
enable-jar-classes
false
true. 클래스 로딩 순서에 영향을 줄 수 있으므로, 앱이 이전의 false 기본값을 사용하여 특정 순서에 의존하는 경우에는 이 요소를 false로 설정할 수 있습니다.
delete-jsps
false
true
compile-encoding
utf-8
utf-8
포함 및 제외 문법
경로 패턴은 <include> 및 <exclude> 요소를 0개 이상의 사용하여 지정됩니다. 패턴에서 '*'는 파일 또는 디렉터리 이름의 문자를 0개 이상 나타내고, **는 경로에 있는 디렉터리를 0개 이상 나타냅니다. 앱을 App Engine에 배포하면 <exclude> 패턴과 일치하는 파일과 디렉터리는 업로드되지 않습니다. 단, 로컬 개발 서버에서 실행하는 경우에는 이러한 파일과 디렉터리는 애플리케이션에 계속 액세스할 수 있습니다.
<include> 요소는 모든 파일을 포함하는 기본 동작을 재정의합니다. <exclude> 요소는 모든 <include> 패턴(그리고 <include>를 명시적으로 제공하지 않은 경우에는 기본값) 이후에 적용됩니다.
다음 예시는 모든 .png 파일(data/ 디렉터리와 해당 하위 디렉터리의 파일 제외)을 정적 파일로 지정하는 방법을 보여줍니다.
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["이해하기 어려움","hardToUnderstand","thumb-down"],["잘못된 정보 또는 샘플 코드","incorrectInformationOrSampleCode","thumb-down"],["필요한 정보/샘플이 없음","missingTheInformationSamplesINeed","thumb-down"],["번역 문제","translationIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-09-04(UTC)"],[[["\u003cp\u003eThe \u003ccode\u003eappengine-web.xml\u003c/code\u003e file, located in the \u003ccode\u003eWEB-INF/\u003c/code\u003e directory of a WAR file, is essential for configuring App Engine Java applications, including settings for static files, resource files, and non-default services.\u003c/p\u003e\n"],["\u003cp\u003e\u003ccode\u003eappengine-web.xml\u003c/code\u003e includes elements like \u003ccode\u003e<application>\u003c/code\u003e (project ID), \u003ccode\u003e<app-engine-apis>\u003c/code\u003e (legacy services), \u003ccode\u003e<entrypoint>\u003c/code\u003e (custom entry point), and numerous others, to manage various aspects of application behavior such as scaling, environment variables, and session management.\u003c/p\u003e\n"],["\u003cp\u003eScaling configurations in \u003ccode\u003eappengine-web.xml\u003c/code\u003e are defined through elements like \u003ccode\u003e<automatic-scaling>\u003c/code\u003e, \u003ccode\u003e<basic-scaling>\u003c/code\u003e, and \u003ccode\u003e<manual-scaling>\u003c/code\u003e, each allowing control over instance management, CPU utilization, request handling, and idle behavior.\u003c/p\u003e\n"],["\u003cp\u003eStaging elements within \u003ccode\u003eappengine-web.xml\u003c/code\u003e enable customization of the deployment preparation process, including splitting large JAR files, handling JSP compilation, and managing the inclusion or exclusion of specific files, with different defaults depending on whether the App Engine SDK or Google Cloud SDK is used.\u003c/p\u003e\n"],["\u003cp\u003eStatic files are managed with \u003ccode\u003e<static-files>\u003c/code\u003e and \u003ccode\u003e<resource-files>\u003c/code\u003e, through include and exclude rules using \u003ccode\u003e*\u003c/code\u003e and \u003ccode\u003e**\u003c/code\u003e wildcards, and mime-types that can be defined in \u003ccode\u003eweb.xml\u003c/code\u003e.\u003c/p\u003e\n"]]],[],null,["# appengine-web.xml reference\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\n### Region ID\n\nThe \u003cvar translate=\"no\"\u003eREGION_ID\u003c/var\u003e is an abbreviated code that Google assigns\nbased on the region you select when you create your app. The code does not\ncorrespond to a country or province, even though some region IDs may appear\nsimilar to commonly used country and province codes. For apps created after\nFebruary 2020, \u003cvar translate=\"no\"\u003eREGION_ID\u003c/var\u003e`.r` is included in\nApp Engine URLs. For existing apps created before this date, the\nregion ID is optional in the URL.\n\nLearn more\n[about region IDs](/appengine/docs/standard/python/how-requests-are-routed#region-id). \nOK\n| **Note:** If you use legacy bundled services and want to upgrade to Java 21, you can choose to continue using `javax.servlet.*` APIs only if your apps run on Java Enterprise Edition 8 (EE8). You must update your `appengine-web.xml` file if you choose to remain on EE8. To learn more about your configuration options, see [Upgrade an existing application](/appengine/docs/standard/java-gen2/upgrade-java-runtime).\n\nYou should use the `appengine-web.xml` file for configuring your app only\nif you are migrating an existing app from the App Engine Java 8 runtime to the\nlatest supported Java version and you want to [use the legacy bundled services](/appengine/docs/standard/java-gen2/services/access).\nIf you are using an `appengine-web.xml` in your project, the `app.yaml` is\nautomatically generated for you at deployment.\n\nApp Engine Java applications use a configuration file, named `appengine-web.xml`,\nto specify information about your app and to identify which files in the app's\n`WAR` file are static files (like images) and which are resource files used by\nthe application.\n\nSyntax\n------\n\nAn App Engine Java app must have a file named `appengine-web.xml` in its\nWAR, in the directory `WEB-INF/`. This is an XML file whose root element is\n`\u003cappengine-web-app\u003e`.\n\nYou can find the Document Type Definition and schema specifications for the\n`appengine-web.xml` in the SDK's `docs/` directory.\n| **Note:** The standard `appengine-web.xml` file defines the default service. You will need to specify additional configuration parameters for each non-default service, which were formerly known as modules. These are described in the [overview of\n| App Engine](/appengine/docs/standard). You can also apply these configuration parameters to the default service.\n\n### Scaling elements\n\nThe following table lists the options for defining how you can specify that your\napplication should scale.\n\nFor a comparison of the performance features of the scaling types, see\n[Scaling dynamic instances](/appengine/docs/standard/how-instances-are-managed#scaling_dynamic_instances).\n\n### Staging elements\n\nMuch of the work done during a deployment occurs locally in a preparation step\ncalled *staging*, where JAR files are assembled, JSPs are compiled, and so forth.\nYou can optionally configure certain parts of the staging\nbehavior using staging elements in the application configuration file. Most\napplications will deploy successfully without manually configuring staging\nbehavior. If your app doesn't deploy, you may need to configure staging\nusing the options shown below.\n\n### Staging option defaults\n\nThe defaults for staging options are different depending on whether you use\nGoogle Cloud SDK-based tooling, such as the gcloud CLI, or the\nGoogle Cloud SDK-based\n[Maven](/appengine/docs/standard/java-gen2/using-maven),\n[Gradle](/appengine/docs/standard/java-gen2/using-gradle),\n[Eclipse](/eclipse/docs), or [IntelliJ](/tools/intellij/docs) plugins.\n\n### Include and exclude syntax\n\nPath patterns are specified using zero or more `\u003cinclude\u003e` and\n`\u003cexclude\u003e` elements. In a pattern, `'*'` represents zero or more\nof any character in a file or directory name, and `**` represents zero or more\ndirectories in a path. Files and directories matching `\u003cexclude\u003e`\npatterns will not be uploaded when you deploy your app to App Engine. However,\nthese files and directories will still be accessible to your application when\nrunning on the local Development Server.\n\nAn `\u003cinclude\u003e` element overrides the default behavior of including\nall files. An `\u003cexclude\u003e` element applies after all\n`\u003cinclude\u003e` patterns (as well as the default if no explicit\n`\u003cinclude\u003e` is provided).\n\nThe following example demonstrates how to designate all `.png` files as static\nfiles (except those in the `data/` directory and all of its subdirectories): \n\n \u003cstatic-files\u003e\n \u003cinclude path=\"/**.png\" /\u003e\n \u003cexclude path=\"/data/**.png\" /\u003e\n \u003c/static-files\u003e\n\nYou can also set HTTP headers to use when responding to requests to these static\nresources. \n\n \u003cstatic-files\u003e\n \u003cinclude path=\"/my_static-files\" \u003e\n \u003chttp-header name=\"Access-Control-Allow-Origin\"\n value=\"http://example.org\" /\u003e\n \u003c/include\u003e\n \u003c/static-files\u003e\n\n| **Note:** If the `path` string doesn't start with a slash, then the HTTP headers, if any, work on App Engine but do **not** work on the Development Server.\n\nMIME types for static files\n---------------------------\n\nBy default, static files are served using a MIME type selected based on the\nfilename extension. You can associate custom MIME types with filename\nextensions for static files using `mime-mapping` elements in `web.xml`.\n\nURLFetch timeout\n----------------\n\nYou can set a deadline for each\n[URLFetch](/appengine/docs/standard/services/urlfetch/issue-requests#setting_a_request_timeout) request. By default, the deadline for a fetch is 5 seconds.\nYou can change this default by including the following setting in your\n`appengine-web.xml` configuration file. Specify the timeout in seconds: \n\n \u003csystem-properties\u003e\n \u003cproperty name=\"appengine.api.urlfetch.defaultDeadline\" value=\"10\"/\u003e\n \u003c/system-properties\u003e"]]