Проблема развертывания GCP приложения SpringBoot - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь развернуть приложение GAE SpringBoot на GCP, но безуспешно.

Ошибка ниже:

Неисследованное исключение из сервлета
java.lang.RuntimeException: javax.servlet.ServletException: не работает на Jetty, поддержка JSR-356 недоступна в org.eclipse.jetty.annotations.ServletContainerInitializersStarter.doStart (ServletContainerInitializersStarter.jtil.tyl.tju:68) component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) в
org.eclipse.jetty.servlet.ServletContextHandler.startContext (ServletContextHandler.java:330)

POM

<?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>

1 Ответ

0 голосов
/ 06 мая 2018

Вы должны преобразовать ваше приложение в конфигурацию App Engine. Если вы используете стандарт GOOGLE APP ENGINE, выполните эти шаги :

Используйте упаковку WAR

Для развертывания в Google App Engine Standard необходимо использовать упаковку WAR. Если вы сгенерировали проект 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 Starter

Google App Engine Standard развертывает вашу WAR на сервере Jetty. Стартер Spring Boot включает 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 Standard:

<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>appengine-maven-plugin</artifactId>
  <version>1.3.1</version>
</plugin>

Этот плагин используется для запуска локального сервера разработки, а также для развертывания приложения в Google App Engine.

Добавить конфигурацию ядра приложения

Добавить 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>
...