本文档介绍了如何将 Java 8 应用重新封装为 JAR 文件,以便在受支持的 Java 运行时环境中运行。如需使用受支持的 Java 运行时,您可以嵌入 Jetty 等服务器,也可以使用 Docker 将应用容器化以实现自定义运行时,而无需完全重写应用。您可以在现代 Java 平台或灵活的云环境中运行现有的 WAR 应用。请从以下方法中选择最适合您的部署策略和基础设施的方法:
准备 Java 8 Web 应用 (WAR 文件)
在将 Java 8 应用重新封装为受支持的 JAR 文件之前,您必须构建 WAR 文件。本部分提供了一个构建 WAR 文件的 Java 8 应用示例。按照以下说明创建 Java 8 hello-world
应用:
在源目录中创建一个
HelloServlet.java
文件:创建
web.xml
部署描述符文件以配置您的 Web 应用:创建着陆页
index.jsp
:在
pom.xml
文件中添加以下代码,以定义 Java 8 应用的 build:WAR 打包配置:
<groupId>com.example</groupId> <artifactId>HelloWorldApp</artifactId> <version>1.0</version> <packaging>war</packaging>
maven-war-plugin
插件,并将maven.compiler
源代码和目标代码设置为版本1.8
:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <java.version>8</java.version> </properties>
javax.servlet-api
依赖项:<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
Maven 配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build>
您的项目目录应类似于以下结构:
├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── HelloServlet.java └── webapp ├── WEB-INF │ └── web.xml └── index.jsp
在应用的项目目录中运行
mvn install
,以在目标目录中生成 WAR 文件HelloWorldApp-1.0.war
。
使用 Dockerfile 部署应用(推荐)
自定义运行时适合支持自定义容器的平台,例如 App Engine 自定义运行时。自定义运行时可让您配置运行时环境,从而提供灵活性。如需查看有关部署自定义运行时的演示示例,请参阅在 App Engine 柔性环境中创建自定义运行时应用。
以下说明介绍了如何使用 Dockerfile 将 Java 8 应用容器化:
构建容器映像并将其推送到 Artifact Registry
本部分介绍如何使用 Cloud Build 构建 Docker 映像并将其推送到 Artifact Registry 代码库。请按照以下步骤创建应用的容器映像:
在源目录中创建一个
cloudbuild.yaml
文件,以构建 Docker 映像并推送到 Artifact Registry:steps: # Step 1: Build the Docker image - name: "gcr.io/cloud-builders/docker" args: - "build" - "-t" - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION" - "." # Step 2: Push the Docker image to Artifact Registry - name: "gcr.io/cloud-builders/docker" args: - "push" - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION" images: - "$LOCATION-docker.pkg.dev/$PROJECT/$REPOSITORY/SERVICE:VERSION"
您需要进行如下替换:
- 将 LOCATION 替换为您部署应用的 Google Cloud 区域。
- 将 PROJECT 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 代码库的名称。
- 将 IMAGE 替换为容器映像网址。
- 将 TAG 替换为您的容器映像标记。
创建一个包含以下配置的 Dockerfile:
下载并安装 Docker 以测试示例应用,并在本地机器上运行 Hello World 容器。
构建容器映像并将其推送到 Artifact Registry:
gcloud builds submit .
部署应用
如需部署 App Engine 应用,请执行以下操作:
将
app.yaml
文件配置为在源目录中使用自定义运行时:您的项目目录应类似于以下结构:
├── Dockerfile ├── README.md ├── app.yaml ├── cloudbuild.yaml ├── pom.xml └── src └── main ├── java │ └── com │ └── example │ └── HelloServlet.java └── webapp ├── WEB-INF │ └── web.xml └── index.jsp
使用
gcloud app deploy
命令部署您的应用:gcloud app deploy --image-url=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:tag
您需要进行如下替换:
- 将 LOCATION 替换为您部署应用的 Google Cloud 区域。
- 将 PROJECT 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 代码库的名称。
- 将 IMAGE 替换为容器映像网址。
- 将 TAG 替换为您的容器映像标记。
使用嵌入式 Java 运行时
以下说明演示了如何将 App Engine Java 8 应用与嵌入式服务器 (Jetty) 重新封装,以便在受支持的 Java 运行时环境中作为独立 JAR 运行:
创建嵌入式 Jetty 服务器
如需将应用 WAR 文件与嵌入式 Jetty 服务器捆绑在一起,请按以下步骤操作:
创建
Main
类以初始化和配置用于运行 WAR 文件的 Jetty 服务器。Main
类会设置服务器端口(默认为8080
)。您还可以修改源代码,以使用PORT
环境变量中指定的端口。Main
类会将WebAppContext
处理程序配置为传送 WAR 文件:创建 Maven 项目文件
pom.xml
并添加以下配置:将
maven.compiler.source
和maven.compiler.target
属性设置为受支持的 Java 运行时:添加 Jetty 的依赖项:
将
maven-assembly-plugin
属性配置为软件包依赖项:
您的项目目录应类似于以下结构:
├─src │ └─main │ └─java │ └─jetty │ └─Main.java └─pom.xml
在 Jetty 运行程序项目目录中运行
mvn install
命令。这会在目标目录中生成jetty-jar-with-dependencies.jar
。按照准备 Java 8 Web 应用 (WAR 文件)部分中的说明创建 WAR 文件。
使用内嵌的 Jetty 运行 WAR 文件并部署您的应用
本部分介绍了将应用打包为可执行 JAR 文件的步骤。请按照以下说明来打包和部署您的应用:
将生成的 Jetty 运行程序 JAR
jetty-jar-with-dependencies.jar
和应用 WAR 文件HelloWorldApp-1.0.war
放在同一目录中。使用受支持的 Java 运行时运行应用:
java -jar jetty-jar-with-dependencies.jar HelloWorldApp-1.0.war
- 在网络浏览器中,前往 http://localhost:8080。您应该会看到应用的欢迎页面。
在
app.yaml
文件中创建一个entrypoint
元素,以调用jetty-jar-with-dependencies
文件并将 WAR 文件作为参数传递。您在 WAR 文件中指定的版本必须与pom.xml
文件的版本相同:使用
gcloud app deploy
命令部署您的应用。