{"id":15043079,"url":"https://github.com/googlecloudplatform/appengine-java-standard","last_synced_at":"2025-12-11T19:06:35.574Z","repository":{"id":41093596,"uuid":"436425883","full_name":"GoogleCloudPlatform/appengine-java-standard","owner":"GoogleCloudPlatform","description":"Google App Engine Standard Java runtime: Prod runtime, local devappserver, Cloud SDK Java components, GAE APIs, and GAE API emulators.","archived":false,"fork":false,"pushed_at":"2025-05-11T10:32:24.000Z","size":13189,"stargazers_count":207,"open_issues_count":15,"forks_count":51,"subscribers_count":39,"default_branch":"main","last_synced_at":"2025-05-11T11:31:01.332Z","etag":null,"topics":["appengine","appengine-java","google","google-cloud","google-cloud-platform","java","java-8","java11","java17","java8","paas","serverless","servlets"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GoogleCloudPlatform.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-08T23:47:23.000Z","updated_at":"2025-05-11T10:32:27.000Z","dependencies_parsed_at":"2024-01-03T01:15:04.125Z","dependency_job_id":"b97754eb-9eaa-4ddd-b290-036064ab8cf1","html_url":"https://github.com/GoogleCloudPlatform/appengine-java-standard","commit_stats":{"total_commits":659,"total_committers":27,"mean_commits":24.40740740740741,"dds":"0.43095599393019723","last_synced_commit":"c041d61ec96d69776f0b863064ecd371c9d90e6a"},"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleCloudPlatform%2Fappengine-java-standard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleCloudPlatform%2Fappengine-java-standard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleCloudPlatform%2Fappengine-java-standard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleCloudPlatform%2Fappengine-java-standard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GoogleCloudPlatform","download_url":"https://codeload.github.com/GoogleCloudPlatform/appengine-java-standard/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254059521,"owners_count":22007771,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["appengine","appengine-java","google","google-cloud","google-cloud-platform","java","java-8","java11","java17","java8","paas","serverless","servlets"],"created_at":"2024-09-24T20:48:32.594Z","updated_at":"2025-12-11T19:06:35.567Z","avatar_url":"https://github.com/GoogleCloudPlatform.png","language":"Java","readme":"\u003c!--\n Copyright 2021 Google LLC\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n     https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n--\u003e\n[![Java17/21/25](https://github.com/GoogleCloudPlatform/appengine-java-standard/actions/workflows/maven.yml/badge.svg)](https://github.com/GoogleCloudPlatform/appengine-java-standard/actions/workflows/maven.yml)\n[![Maven][maven-version-image]][maven-version-link]\n[![Code of conduct](https://img.shields.io/badge/%E2%9D%A4-code%20of%20conduct-blue.svg)](https://github.com/GoogleCloudPlatform/appengine-java-standard/blob/main/CODE_OF_CONDUCT.md)\n\n# Google App Engine (GAE) standard environment source code for Java 17, Java 21, Java 25.\n\n\nThis repository contains the Java source code for [Google App Engine\nstandard environment][ae-docs], the production runtime, the App Engine APIs, and the local SDK.\n\n[ae-docs]: https://cloud.google.com/appengine/docs/standard/java\n\n## Prerequisites\n\n### Use a JDK17 environment, so it can build the Java17 GAE runtime.\n\n[jdk17](https://adoptium.net/), but using a JDK21 or JDK25 is also possible.\n\nThe shared codebase is also used for GAE Java 17, Java 21 and Java 25 build and test targets, using GitHub actions:\n\n- [Java 17/21/25 Continuous Integration](https://github.com/GoogleCloudPlatform/appengine-java-standard/actions/workflows/maven.yml)\n\n## Releases\n\nThis repository is the open source mirror of the Google App Engine Java source code that was used to produce Maven artifacts and runtime jars.\nThe open source release mechanism used with this GitHub repository is using the version starting at 3.0.x, compatible for Java 17 or above.\n\n\n## Modules\n\nThis repository is organized into several Maven modules. For a detailed description of each module, its dependencies, and how they relate to each other, see [modules.md](modules.md).\n\nOrange items are public modules artifacts and yellow are internal ones.\nModules ending with * are only used on the production server side.\n\n\u003cimg width=\"964\" alt=\"pom_dependencies\" src=\"https://github.com/GoogleCloudPlatform/appengine-java-standard/blob/main/images/pom_dependencies.png\"\u003e\n\n### App Engine Java APIs\n\nSource code for all public APIs for com.google.appengine.api.* packages.\n\n- [Public Documentation][ae-docs]\n- [Latest javadoc.io API Javadocs from this repository](https://javadoc.io/doc/com.google.appengine/appengine-apis/latest/index.html)\n- [Javadocs](https://cloud.google.com/appengine/docs/standard/java-gen2/reference/services/bundled/latest/overview)\n- [Source Code](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/api)\n- [Source Code for repackaged API jar](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/appengine-api-1.0-sdk)\n\nNote that some App Engine APIs such as Blobstore and Taskqueues provide classes that depend on servlet APIs.\nThe base packages `com.google.appengine.api.blobstore` and `com.google.appengine.api.taskqueue` contain classes that use `javax.servlet.*` for EE6/EE8 compatibility.\nFor EE10 and EE11 environments that use the `jakarta.servlet.*` namespace, use classes from `com.google.appengine.api.blobstore.jakarta` and `com.google.appengine.api.taskqueue.jakarta` packages.\nThe packages `com.google.appengine.api.blobstore.ee10` and `com.google.appengine.api.taskqueue.ee10` are deprecated starting from version 3.0.0.\n\n*  Maven pom.xml\n\n    ```\n    \u003cpackaging\u003ewar\u003c/packaging\u003e\u003c!-- Servlet 3.1 WAR packaging--\u003e\n    ...\n    \u003cdependencies\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n            \u003cartifactId\u003eappengine-api-1.0-sdk\u003c/artifactId\u003e\n            \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- or later--\u003e\n        \u003c/dependency\u003e\n        \u003cdependency\u003e\n          \u003cgroupId\u003ejavax.servlet\u003c/groupId\u003e\n          \u003cartifactId\u003ejavax.servlet-api\u003c/artifactId\u003e\n          \u003cversion\u003e3.1\u003c/version\u003e\n          \u003cscope\u003eprovided\u003c/scope\u003e\n    \u003c/dependency\u003e\n    ...\n    ```\n\n*  Maven Java 21 with jakarta EE 10 support pom.xml\n\n    ```\n    \u003cpackaging\u003ewar\u003c/packaging\u003e\u003c!-- Servlet 6.0 WAR packaging--\u003e\n    ...\n    \u003cdependencies\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n            \u003cartifactId\u003eappengine-api-1.0-sdk\u003c/artifactId\u003e\n            \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- or later--\u003e\n        \u003c/dependency\u003e\n        \u003cdependency\u003e\n          \u003cgroupId\u003ejakarta.servlet\u003c/groupId\u003e\n          \u003cartifactId\u003ejakarta.servlet-api\u003c/artifactId\u003e\n          \u003cversion\u003e6.0.0\u003c/version\u003e\n          \u003cscope\u003eprovided\u003c/scope\u003e\n        \u003c/dependency\u003e\n    ...\n    ```\n\n*  Maven Java 25 Alpha with jakarta EE 11 support pom.xml (EE10 is not supported in Java25, EE11 is fully compatible with EE10)\n\n    ```\n    \u003cpackaging\u003ewar\u003c/packaging\u003e\u003c!-- Servlet 6.1 WAR packaging--\u003e\n    ...\n    \u003cdependencies\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n            \u003cartifactId\u003eappengine-api-1.0-sdk\u003c/artifactId\u003e\n            \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- or later--\u003e\n        \u003c/dependency\u003e\n        \u003cdependency\u003e\n          \u003cgroupId\u003ejakarta.servlet\u003c/groupId\u003e\n          \u003cartifactId\u003ejakarta.servlet-api\u003c/artifactId\u003e\n          \u003cversion\u003e6.1.0\u003c/version\u003e\n          \u003cscope\u003eprovided\u003c/scope\u003e\n        \u003c/dependency\u003e\n    ...\n    ```\n\n\n*  Java 21/25 with javax EE8 profile appengine-web.xml\n\n    ```\n    \u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n    \u003cappengine-web-app xmlns=\"http://appengine.google.com/ns/1.0\"\u003e\n      \u003cruntime\u003ejava21\u003c/runtime\u003e \u003c-- or java25 alpha--\u003e\n      \u003capp-engine-apis\u003etrue\u003c/app-engine-apis\u003e\n\n      \u003c!-- Add optionally:\n      \u003csystem-properties\u003e\n        \u003cproperty name=\"appengine.use.EE8\" value=\"true\"/\u003e\n    \u003c/system-properties\u003e\n    If you want to keep javax.servlet APIs and not jakarta.servlet by default\n    --\u003e\n    \u003c/appengine-web-app\u003e\n    ```\n\n- [Public Java 17/21/25 Documentation](https://cloud.google.com/appengine/docs/standard/java-gen2/runtime)\n- [How to upgrade to Java21/25](https://cloud.google.com/appengine/docs/standard/java-gen2/upgrade-java-runtime)\n\n*  Java 17 appengine-web.xml\n\n    ```\n    \u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n    \u003cappengine-web-app xmlns=\"http://appengine.google.com/ns/1.0\"\u003e\n      \u003cruntime\u003ejava17\u003c/runtime\u003e\n      \u003capp-engine-apis\u003etrue\u003c/app-engine-apis\u003e\n    \u003c/appengine-web-app\u003e\n    ```\n\n*  Java 21  appengine-web.xml (will default to EE10, but EE8 possible)\n\n    ```\n    \u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n    \u003cappengine-web-app xmlns=\"http://appengine.google.com/ns/1.0\"\u003e\n      \u003cruntime\u003ejava21\u003c/runtime\u003e\n      \u003capp-engine-apis\u003etrue\u003c/app-engine-apis\u003e\n    \u003c/appengine-web-app\u003e\n    ```\n\n\n*  Java 25  appengine-web.xml (will default to EE11, but EE8 possible) Alpha\n\n    ```\n    \u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n    \u003cappengine-web-app xmlns=\"http://appengine.google.com/ns/1.0\"\u003e\n      \u003cruntime\u003ejava25\u003c/runtime\u003e\n      \u003capp-engine-apis\u003etrue\u003c/app-engine-apis\u003e\n    \u003c/appengine-web-app\u003e\n    ```\n\n### App Engine Java Remote APIs\n\nSource code for remote APIs for App Engine.\n\n- [Public Documentation](https://cloud.google.com/appengine/docs/standard/java/tools/remoteapi)\n- [Latest javadoc.io Javadocs from this repository](https://javadoc.io/doc/com.google.appengine/appengine-remote-api)\n- [Public Sample remote server](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/main/appengine-java8/remote-server)\n- [Public Sample remote client](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/main/appengine-java8/remote-client)\n- [Source Code](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/remoteapi)\n\n* Servlet web.xml\n\n```\n   \u003cservlet\u003e\n     \u003cdisplay-name\u003eRemote API Servlet\u003c/display-name\u003e\n     \u003cservlet-name\u003eRemoteApiServlet\u003c/servlet-name\u003e\n     \u003cservlet-class\u003ecom.google.apphosting.utils.remoteapi.RemoteApiServlet\u003c/servlet-class\u003e\n     \u003cload-on-startup\u003e1\u003c/load-on-startup\u003e\n   \u003c/servlet\u003e\n   \u003cservlet-mapping\u003e\n     \u003cservlet-name\u003eRemoteApiServlet\u003c/servlet-name\u003e\n     \u003curl-pattern\u003e/remote_api\u003c/url-pattern\u003e\n   \u003c/servlet-mapping\u003e\n```\n\n\n* Servlet jakarta EE10 and EE11 web.xml\n\n```\n   \u003cservlet\u003e\n     \u003cdisplay-name\u003eRemote API Servlet\u003c/display-name\u003e\n     \u003cservlet-name\u003eRemoteApiServlet\u003c/servlet-name\u003e\n     \u003cservlet-class\u003ecom.google.apphosting.utils.remoteapi.JakartaRemoteApiServlet\u003c/servlet-class\u003e\n     \u003cload-on-startup\u003e1\u003c/load-on-startup\u003e\n   \u003c/servlet\u003e\n   \u003cservlet-mapping\u003e\n     \u003cservlet-name\u003eRemoteApiServlet\u003c/servlet-name\u003e\n     \u003curl-pattern\u003e/remote_api\u003c/url-pattern\u003e\n   \u003c/servlet-mapping\u003e\n```\n\n*  Maven javax and jakarta API pom.xml\n\n```\n    \u003cdependency\u003e\n       \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n       \u003cartifactId\u003eappengine-remote-api\u003c/artifactId\u003e\n       \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- or later--\u003e\n    \u003c/dependency\u003e\n```\n\n#### User Visible Changes With Maven Builds\n\nWe moved `com.google.appengine.api.memcache.stdimpl` and its old dependency\n`javax.cache` from `appengine-api-1.0-sdk.jar` to  a new jar `appengine-api-legacy.jar`.\n\n- [Latest javadoc.io Javadocs from this repository](https://javadoc.io/doc/com.google.appengine/appengine-api-legacy)\n\n  Users who depend on the\n  moved classes will need to also include `appengine-api-legacy.jar` when\n  they build/deploy. Separating these classes allows\n  `appengine-api-1.0-sdk` users to choose any version of `javax.cache`\n  rather than being constrained by an obsolete included version.\n\n  *  Maven pom.xml\n\n```\n    \u003cdependency\u003e\n       \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n       \u003cartifactId\u003eappengine-api-legacy.jar/artifactId\u003e\n       \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- Or later--\u003e\n    \u003c/dependency\u003e\n```\n\n###  Local Unit Testing for Java 17, 21, 25\n\n- [Code Sample](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/main/unittests)\n- [Latest javadoc.io Javadocs from this repository](https://javadoc.io/doc/com.google.appengine/appengine-testing)\n\n  *  Maven pom.xml\n\n```\n    \u003cdependency\u003e\n      \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n      \u003cartifactId\u003eappengine-testing\u003c/artifactId\u003e\n      \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- or later--\u003e\n      \u003cscope\u003etest\u003c/scope\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n      \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n      \u003cartifactId\u003eappengine-api-stubs\u003c/artifactId\u003e\n      \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- or later--\u003e\n      \u003cscope\u003etest\u003c/scope\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n      \u003cgroupId\u003ecom.google.appengine\u003c/groupId\u003e\n      \u003cartifactId\u003eappengine-tools-sdk\u003c/artifactId\u003e\n      \u003cversion\u003e3.0.2\u003c/version\u003e\u003c!-- or later--\u003e\n      \u003cscope\u003etest\u003c/scope\u003e\n    \u003c/dependency\u003e\n```\n\n\n### App Engine Java local development implementation of the APIs\n\nImplementation of all the App Engine APIs for local environment (devappserver)\nand local testing of an application before deployment.\n\n- [Public Documentation][ae-docs]\n- [Source Code](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/api_dev)\n- [Source Code for repackaged APIs stubs jar](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/appengine-api-stubs)\n\n\n### App Engine Java various local development utilities and devappserver\n\nSource code for the App Engine local dev application server and local utilities.\n\n- [Public Documentation](https://cloud.google.com/appengine/docs/standard/java/tools/using-local-server)\n- [Source Code for tools APIs (appcfg)](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/lib/tools_api)\n- [Source Code for XML validator (appcfg)](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/lib/xml_validator)\n- [Source Code for local devappserver](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/runtime/local)\n- [Source Code for shared utilities (appcfg)](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/shared_sdk)\n- [Source Code for shared utilities (config)](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/utils)\n\n### App Engine Java production runtime execution environment\n\nSource code for the App Engine production application server and utilities. It is based on the Jetty9.4 Web Server.\n\n- [Public Documentation][ae-docs]\n- [Source Code for the runtime implementation](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/runtime/impl)\n- [Source Code for the Java Main](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/runtime/main)\n- [End-to-End test Web Applications](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/runtime/testapps)\n- [End-to-End tests](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/runtime/test)\n- [Source Code for runtime utilities](https://github.com/GoogleCloudPlatform/appengine-java-standard/tree/master/runtime/util)\n\n## Default entrypoint used by Java17, Java21 and Java25\n\nThe Java 17, Java 21 and 25 runtimes can benefit from extra user configuration when starting the JVM for web apps.\n\nThe default entrypoint used to boot the JVM is generated by App Engine Buildpacks.\nEssentially, it is equivalent to define this entrypoint in the `appengine-web.xml` file. For example:\n\n\u003cpre\u003e\u003centrypoint\u003ejava --add-opens java.base/java.lang=ALL-UNNAMED  --add-opens java.base/java.nio.charset=ALL-UNNAMED -showversion -Xms32M -Xmx204M -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+PrintCommandLineFlags -Dclasspath.runtimebase=/base/java_runtime -Djava.class.path=/base/java_runtime/runtime-main.jar -Djava.library.path=/base/java_runtime: com/google/apphosting/runtime/JavaRuntimeMainWithDefaults --fixed_application_path=/workspace /base/java_runtime\u003c/entrypoint\u003e\u003c/pre\u003e\n\nWe do not recommend changing this default entrypoint as the memory settings are calculated based on the instance type (F1, F2, F4) and memory available.\n\nBy default, we use `--add-opens java.base/java.lang=ALL-UNNAMED  --add-opens java.base/java.nio.charset=ALL-UNNAMED` to open some necessary JDK APIs.\n\n\n## Entry Point Features\n\nThe entry point for the Java 17, Java 21, 25 runtimes can be customized with user-defined environment variables added in the `appengine-web.xml` configuration file.\n\nThe following table indicates the environment variables that can be used to enable/disable/configure features, and the default values if they are not set:\n\n| Env Var           | Description          | Type     | Default                                     |\n|-------------------|----------------------|----------|---------------------------------------------|\n| `CPROF_ENABLE`    | Stackdriver Profiler | boolean  | `false`                                     |\n| `GAE_MEMORY_MB`   | Available memory     | size     | Set by GAE or `/proc/meminfo`-400M          |\n| `HEAP_SIZE_RATIO` | Memory for the heap  | percent  | 80                                          |\n| `HEAP_SIZE_MB`    | Available heap       | size     | `${HEAP_SIZE_RATIO}`% of `${GAE_MEMORY_MB}` |\n| `JAVA_HEAP_OPTS`  | JVM heap args        | JVM args | `-Xms${HEAP_SIZE_MB}M -Xmx${HEAP_SIZE_MB}M` |\n| `JAVA_GC_OPTS`    | JVM GC args          | JVM args | `-XX:+UseG1GC` plus configuration           |\n| `JAVA_USER_OPTS`  | JVM other args       | JVM args |                                             |\n| `JAVA_OPTS`       | JVM args             | JVM args | See below                                   |\n\nIf not explicitly set, `JAVA_OPTS` is defaulted to:\n\n   ```\n   JAVA_OPTS:=-showversion \\\n              ${DBG_AGENT} \\\n              ${PROFILER_AGENT} \\\n              ${JAVA_HEAP_OPTS} \\\n              ${JAVA_GC_OPTS} \\\n              ${JAVA_USER_OPTS}\n   ```\n\nWhen `CPROF_ENABLE` is true, the default entrypoint adds the `PROFILER_AGENT` as:\n\n`-agentpath:/opt/cprof/profiler_java_agent.so=--logtostderr`\n\nFor example, if your application code needs more `-add-opens` flags, you can use the `JAVA_USER_OPTS` environment variable defined in the `appengine-web.xml` file:\n\n  ```\n    \u003cenv-variables\u003e\n       \u003cenv-var name=\"JAVA_USER_OPTS\" value=\"--add-opens java.base/java.util=ALL-UNNAMED\" /\u003e\n     \u003c/env-variables\u003e\n  ```\n\n**Note:**\n\n*   Only one of `appengine.use.EE8`, `appengine.use.EE10`, or `appengine.use.EE11` can be set to `true` at a time.\n*   Flags can be set in `WEB-INF/appengine-web.xml` or via Java system properties (e.g., `-Dappengine.use.EE10=true`). System properties override `appengine-web.xml`.\n*   EE6 = Servlet 3.1 (`javax.*`), EE8 = Servlet 4.0 (`javax.*`), EE10 = Servlet 5.0 (`jakarta.*`), EE11 = Servlet 6.0 (`jakarta.*`).\n*   Jetty 12.1 should be fully backward compatible with Jetty 12.0 and EE11 version should also be backward compatible with EE10.\n*   EE8 should also be backward compatible with EE6.\n\n\n\n\n### Java 17 (`\u003cruntime\u003ejava17\u003c/runtime\u003e`)\n\n| Flag(s) Set in `appengine-web.xml` or System Properties | Resulting Jetty | Support | Resulting EE Version | Notes |\n| :--- | :--- | :--- | :--- | :--- |\n| _None (default)_ | 9.4 | GA | 6 | |\n| `appengine.use.EE8=true` | 12.0 | GA | 8 | |\n| `appengine.use.EE10=true` | 12.0 | GA | 10 | |\n| `appengine.use.EE8=true`, `appengine.use.jetty121=true` | 12.1 | Early Access | 8 | |\n| `appengine.use.EE10=true`, `appengine.use.jetty121=true` | 12.1 | Early Access | 11 | **Upgraded**: EE10 is upgraded to EE11 on Jetty 12.1 |\n| `appengine.use.EE11=true` | 12.1 | Early Access | 11 | `appengine.use.jetty121=true` is used automatically |\n\n##\n\n### Java 21 (`\u003cruntime\u003ejava21\u003c/runtime\u003e`)\n\n| Flag(s) Set in `appengine-web.xml` or System Properties | Resulting Jetty | Support | Resulting EE Version | Notes |\n| :--- | :--- | :--- | :--- | :--- |\n| _None (default)_ | 12.0 | GA | 10 | |\n| `appengine.use.EE8=true` | 12.0 | GA | 8 | |\n| `appengine.use.EE10=true` | 12.0 | GA | 10 | |\n| `appengine.use.jetty121=true` | 12.1 | Early Access | 11 | If no EE flag is set, `jetty121` defaults to EE11 |\n| `appengine.use.EE8=true`, `appengine.use.jetty121=true` | 12.1 | Early Access | 8 | |\n| `appengine.use.EE10=true`, `appengine.use.jetty121=true` | 12.1 | Early Access | 11 | **Upgraded**: EE10 is upgraded to EE11 on Jetty 12.1 |\n| `appengine.use.EE11=true` | 12.1 | Early Access | 11 | `appengine.use.jetty121=true` is used automatically |\n\n##\n\n### Java 25 (`\u003cruntime\u003ejava25\u003c/runtime\u003e`)\n\n| Flag(s) Set in `appengine-web.xml` or System Properties | Resulting Jetty | Support | Resulting EE Version | Notes |\n| :--- | :--- | :--- | :--- | :--- |\n| _None (default)_ | 12.1 | Early Access | 11 | `appengine.use.jetty121=true` is used |\n| `appengine.use.EE8=true` | 12.1 | Early Access | 8 | `appengine.use.jetty121=true` is used |\n| `appengine.use.EE11=true` | 12.1 | Early Access | 11 | `appengine.use.jetty121=true` is used |\n| `appengine.use.EE10=true` | **ERROR** | Unsupported | **ERROR** | EE10 is not supported, use compatible version EE11 instead|\n\n##\n\n## Contributing\n\nCheck out the [contributing guide](CONTRIBUTING.md) to learn how you can report issues and help make changes.\n\nAlways be sure to follow the [Code of Conduct](CODE_OF_CONDUCT.md).\n\n[maven-version-image]: https://img.shields.io/maven-central/v/com.google.appengine/appengine-api-1.0-sdk.svg\n[maven-version-link]: https://search.maven.org/search?q=g:com.google.appengine%20AND%20a:appengine-api-1.0-sdk\u0026core=gav\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgooglecloudplatform%2Fappengine-java-standard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgooglecloudplatform%2Fappengine-java-standard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgooglecloudplatform%2Fappengine-java-standard/lists"}