java - SpringBoot 应用程序 GCP 部署问题
问题描述
我正在尝试在 GCP 上部署 GAE SpringBoot 应用程序,但没有运气。
低于错误:
来自 servlet
java.lang.RuntimeException 的未捕获异常:javax.servlet.ServletException:未在 Jetty 上运行,JSR-356 支持在 org.eclipse.jetty.annotations.ServletContainerInitializersStarter.doStart(ServletContainerInitializersStarter.java:68) 在 org.eclipse 上不可用。 jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 在
org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:330)
聚甲醛
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gcptest</groupId>
<artifactId>gcptest-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Excluded for GCP Conflict, as gcp runs on jetty -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- Dependency for GCP -->
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>1.9.48</version>
</dependency>
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>mysql-socket-factory-connector-j-6</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>1.22.0</version>
</dependency>
<dependency>
<groupId>com.google.appengine.tools</groupId>
<artifactId>appengine-gcs-client</artifactId>
<version>0.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>1.3.1</version>
</plugingcptest
</plugins>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>*.properties</include>
<include>log4j2.json</include>
</includes>
</resource>
</resources>
</build>
</project>
解决方案
您必须将您的应用转换为 App Engine 配置。如果您使用的是 GOOGLE APP ENGINE 标准,请按照以下步骤操作:
使用 WAR 包装
您必须使用 WAR 打包才能部署到 Google App Engine Standard。如果您从 生成 Spring Boot 项目start.spring.io
,请确保切换到初始化站点的完整版本视图,并选择 WAR 打包。
如果您有一个现有的JAR
打包项目,您可以通过以下方式将其转换为WAR
项目:
在 pom.xml 中,更改<packaging>jar</packaging>
为<packaging>war</packaging>
创建一个新的 SpringBootServletInitializer 实现:
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(YourApplication.class);
}
}
删除 Tomcat 启动器
Google App Engine Standard 将您的 WAR 部署到 Jetty 服务器中。Spring Boot 的 starter 默认包含 Tomcat。这会引入冲突。排除 Tomcat 依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
不要包含 Jetty 依赖项。但是您必须包含 Servlet API 依赖项:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
添加 App Engine 标准插件
在 中pom.xml
,添加 App Engine 标准插件:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>1.3.1</version>
</plugin>
该插件用于运行本地开发服务器以及将应用程序部署到 Google App Engine 中。
添加 App 引擎配置
添加一个src/main/webapp/WEB-INF/appengine-web.xml
:
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<version>1</version>
<threadsafe>true</threadsafe>
<runtime>java8</runtime>
</appengine-web-app>
在 Google App Engine 中运行的应用程序需要此配置。
排除 JUL 到 SLF4J 桥
Spring Boot 的默认日志桥与 Jetty 的日志系统冲突。为了能够捕获 Spring Boot 启动日志,您需要排除org.slf4j:jul-to-slf4j
依赖关系。最简单的方法是将依赖范围设置为提供,这样它就不会包含在 WAR 文件中:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
内存不足错误
使用Spring Boot >= 1.5.6
,您可能会在启动时遇到内存不足错误。请按照以下说明解决此问题:
在里面src/main/resources
,添加一个logging.properties
文件:
.level = INFO
在里面src/main/webapp/WEB-INF/appengine-web.xml
,添加一个指向新logging.properties
文件的配置。
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/classes/logging.properties"/>
</system-properties>
推荐阅读
- python - QListWidget Item 突出显示项目的不同颜色
- mongodb - 为缺失的分组数据生成默认值
- c# - 如何将 ECDSA 公钥与其私钥配对
- android - 重新验证用户导致 https.onCall() 火库云功能无法接收经过身份验证的用户信息
- javascript - 如何根据元素更改光标
- android - 无法在 Android Pie 上进行 HTTP 请求
- html - 用于捕获 HTML 元素中的属性值的正则表达式
- arm - 为什么ARM将返回地址保存在链接寄存器而不是堆栈中?
- android - 片段android中的滚动工具栏
- python - Python C API:如何检查对象是否是类型的实例