Hallo Welt mit Google App Engine (Java 11) + Spring Boot + Gradle

Überblick

--Erstellen Sie eine einfache Hello World-Display-Webanwendung mit der Java 11-Standardumgebung von Google App Engine + Spring Boot-Konfiguration

Umgebung

--Google App Engine Java 11-Standardumgebung

Grundlegende Änderungen von der Java 8-Standardumgebung zu Java 11

Quellcode

Quellcodeliste

├── build.gradle
├── settings.gradle
└── src
    ├── main
    │   ├── appengine
    │   │   └── app.yaml
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── helloworld
    │   │               ├── HelloworldApplication.java
    │   │               ├── HelloworldController.java
    │   │               └── HelloworldErrorController.java
    │   └── resources
    │       ├── application.yml
    │       ├── static
    │       │   └── assets
    │       │       └── helloworld.png
    │       └── templates
    │           ├── error.html
    │           └── helloworld.html
    └── test
        └── java
            └── com
                └── example
                    └── helloworld
                        └── HelloworldApplicationTests.java

build.gradle

Eine Datei, die den Prozess zum Erstellen in Gradle beschreibt. Das Gradle-Plugin von Google App Engine verwendet die Serie 2.

build.gradle


buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    //Verwenden Sie das Spring Boot Gradle Plugin
    classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.2.0.RELEASE'
    //Verwenden Sie das Google App Engine Gradle-Plugin
    classpath 'com.google.cloud.tools:appengine-gradle-plugin:2.2.0'
  }
}

plugins {
  //Einführung des Java-Plug-Ins
  id 'java'
  // https://plugins.gradle.org/plugin/org.springframework.boot
  id 'org.springframework.boot' version '2.2.0.RELEASE'
  // https://plugins.gradle.org/plugin/io.spring.dependency-management
  id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}

//App Engine Plug-In eingeführt
apply plugin: 'com.google.cloud.tools.appengine'

repositories {
  mavenCentral()
}

dependencies {
  //Neueste Version der App Engine API
  implementation 'com.google.appengine:appengine-api-1.0-sdk:+'
  // Thymeleaf
  implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
  // Spring Web
  implementation 'org.springframework.boot:spring-boot-starter-web'
  // Test
  testImplementation('org.springframework.boot:spring-boot-starter-test') {
    //Schließen Sie die Unterstützung für JUnit 4 aus
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
  }
}

test {
  //Aktivieren Sie die Unterstützung für JUnit 5
  useJUnitPlatform()

  testLogging {
    //Anzeige der Standardausgabe und der Standardfehlerausgabe während des Tests
    showStandardStreams true
    //Ausgabeereignis(TestLogEvent)
    events 'started', 'skipped', 'passed', 'failed'
  }
}

//ID und Version der Webanwendungsgruppe
group   = "com.example.helloworld"
version = "0.0.1"

//Verwenden Sie Java 11
sourceCompatibility = '11'
targetCompatibility = '11'

//Aufgabeneinstellungen für Google App Engine
appengine {
  //Bereitstellungseinstellungen
  // GCLOUD_Wenn Sie CONFIG angeben
  //Die in der gcloud-Konfiguration festgelegten Projektinformationen werden festgelegt
  deploy {
    //Stellen Sie die Ziel-Google Cloud-Projekt-ID bereit
    projectId = "GCLOUD_CONFIG"
    //Web-App-Version, die sich in der Bereitstellung widerspiegelt
    //Wenn nicht angegeben, wird eine neue generiert
    version = "GCLOUD_CONFIG"
  }
}

//Führen Sie vor der Bereitstellung Tests aus
appengineDeploy.dependsOn test
appengineStage.dependsOn test

Referenz:

settings.gradle

Wenn Sie settings.gradle nicht festlegen, wechseln Sie in das übergeordnete Verzeichnis, um settings.gradle zu finden. Fügen Sie es also auch in ein einzelnes Projekt ein.

settings.gradle


rootProject.name = 'helloworld'

app.yaml

Konfigurationsdatei für Google App Engine. Beschreiben der Informationen der Webanwendung.

#Verwenden Sie Java 11
runtime: java11

#Java 8 Runtime F1 hatte 128 MB Speicher, Java 11 hatte 256 MB
instance_class: F1

#Autoscale-Einstellung für die Anzahl der Instanzen
automatic_scaling:
  max_instances: 1 #Maximale Anzahl von Instanzen
  min_instances: 0 #Mindestanzahl von Instanzen. Wenn auf 0 gesetzt, ist die Anzahl der Instanzen 0, wenn sie nicht verwendet werden.
  target_cpu_utilization: 0.95 #CPU-Auslastungsfaktor, der den Start einer neuen Instanz auslöst(0.5 bis 0.Spezifiziert zwischen 95)
  max_concurrent_requests: 80 #Zulässige Anzahl gleichzeitiger Anfragen(Der maximale Wert, der angegeben werden kann, ist 80)

#Umgebungsvariablen festlegen
env_variables:
  JAVA_TOOL_OPTIONS: "-XX:MaxRAM=256m -XX:ActiveProcessorCount=2 -Xmx32m"

Referenz:

HelloworldApplication.java

Anwendungsklasse. Ich schreibe nur die Routineverarbeitung für die Verwendung von Spring Boot.

package com.example.helloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloworldApplication {

  public static void main(String[] args) {
    SpringApplication.run(HelloworldApplication.class, args);
  }
}

HelloworldController.java

Controller-Klasse.

package com.example.helloworld;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloworldController {

  /**
   * application.Nachricht von yml erhalten.
   */
  @Value("${application.message}")
  private String applicationYamlMessage;

  /**
   *Gibt die Antwort der oberen Seite zurück.
   *
   * @Informationen zur Seitenanzeige zurückgeben
   */
  @GetMapping("/")
  public ModelAndView index() {

    System.out.println("HelloworldController#index");

    //Stellen Sie die anzuzeigenden Daten ein
    ModelAndView mav = new ModelAndView();
    mav.addObject("applicationYamlMessage", applicationYamlMessage);
    mav.setViewName("helloworld"); //Name anzeigen. Geben Sie die Thymeleaf-Vorlagendatei an

    return mav;
  }

  /**
   *Eine Testmethode, die eine Fehlerseite anzeigt.
   */
  @GetMapping("/exception/")
  public void exception() {
    System.out.println("HelloworldController#exception");
    throw new RuntimeException("This is a sample exception.");
  }
}

HelloworldErrorController.java

Fehlercontroller-Klasse für die gesamte Webanwendung. Es verarbeitet Nicht gefunden usw., die von einer allgemeinen Controller-Klasse nicht erfasst werden können. Hier wird nur die Mindestverarbeitung beschrieben, die Sie jedoch nach Bedarf anpassen können.

package com.example.helloworld;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/**
 *Fehlercontroller für die gesamte Webanwendung.
 *Eine Implementierungsklasse für die ErrorController-Schnittstelle.
 */
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}") //Zuordnung zur Fehlerseite
public class HelloworldErrorController implements ErrorController {

  /**
   *Fehlerseitenpfad.
   */
  @Value("${server.error.path:${error.path:/error}}")
  private String errorPath;

  /**
   *Gibt den Pfad der Fehlerseite zurück.
   *
   * @Rückgabe des Fehlerseitenpfads
   */
  @Override
  public String getErrorPath() {
    return errorPath;
  }

  /**
   *Gibt ein ModelAndView-Objekt für die Antwort zurück.
   *
   * @param req Anforderungsinformationen
   * @param mav Antwortinformationen
   * @ModelAndView-Objekt für die Rückgabe einer HTML-Antwort
   */
  @RequestMapping
  public ModelAndView error(HttpServletRequest req, ModelAndView mav) {

    System.out.println("HelloWorldErrorController#error");

    //404 Für keinen Fehler gefunden
    //Der Statorcode und der Ausgabeinhalt können nach Bedarf angepasst werden.
    mav.setStatus(HttpStatus.NOT_FOUND);
    mav.setViewName("error"); // error.html
    return mav;
  }
}

application.yml

Eine Datei, die Informationen zu Webanwendungseinstellungen beschreibt. Es können auch application.properties sein. Dieses Mal werden nur die für die Anwendung eindeutigen Informationen festgelegt.

application:
  message: Hello, application yaml.

helloworld.png

Ein als Beispiel platziertes Bild, das den statischen Dateispeicher zeigt. Wenn Sie die statische Datei in src / main / resources / static ablegen, wird sie http: // hostname / zugeordnet. Wenn Sie diesmal auf http: //hostname/assets/helloworld.png zugreifen, wird die Datei src / main / resources / static / assets / helloworld.png bereitgestellt.

error.html

HTML Thymeleaf-Vorlagendatei, die angezeigt wird, wenn ein Fehler auftritt. Diesmal ist der dynamische Wert nicht eingebettet, es ist jedoch möglich, den Wert in der Fehlercontrollerklasse nach Bedarf festzulegen und so anzupassen, dass er auf der Vorlagenseite angezeigt wird.

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
</body>
</html>

helloworld.html

Eine HTML-Thymeleaf-Vorlagendatei zum Anzeigen der von der Controller-Klasse festgelegten Werte.

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Hello, world.</title>
</head>
<body>
<h1>Hello, world.</h1>
<div th:text="'application.yml: ' + ${applicationYamlMessage}"></div>
<div><img src="./assets/helloworld.png "></div>
</body>
</html>

HelloworldApplicationTests.java

Minimale Testklasse. Es werden nur formale Dinge beschrieben. Testet eigentlich nichts.

package com.example.helloworld;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class HelloworldApplicationTests {

  @Test
  void contextLoads() {
  }
}

Operation

Führen Sie den Test mit Gradle-Test durch

Sie können den Test mit der Gradle-Testaufgabe ausführen.

$ gradle test 

Starten Sie den Server lokal mit gradle bootRun

Sie können den lokalen Server http: // localhost: 8080 / mit gradle bootRun starten.

$ gradle bootRun

Die bootRun-Task ist eine Funktion des Spring Boot Gradle-Plugins, sodass die Konfigurationsdatei app.yaml für die Google App Engine nicht geladen wird.

Bereitstellung mit gradle appengineDeploy in Google App Engine

Kann mit gradle appengineDeploy in Google App Engine bereitgestellt werden.

$ gradle appengineDeploy

Aufgaben in Gradle verfügbar

Sie können die Liste der verfügbaren Aufgaben in Gradle-Aufgaben anzeigen.

$ gradle tasks

> Task :tasks

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

App Engine app.yaml based projects tasks
----------------------------------------
appengineCloudSdkLogin - Login and set the Cloud SDK common configuration user
appengineDeploy - Deploy an App Engine application
appengineDeployAll - Deploy an App Engine application and all of its config files
appengineDeployCron - Deploy Cron configuration
appengineDeployDispatch - Deploy Dispatch configuration
appengineDeployDos - Deploy Dos configuration
appengineDeployIndex - Deploy Index configuration
appengineDeployQueue - Deploy Queue configuration
appengineShowConfiguration - Show current App Engine plugin configuration
appengineStage - Stage an App Engine app.yaml based project for deployment
checkCloudSdk - Validates the Cloud SDK
downloadCloudSdk - Download the Cloud SDK

Application tasks
-----------------
bootRun - Runs this project as a Spring Boot application.
(Folgendes wird weggelassen)

Referenzmaterial

Recommended Posts

Hallo Welt mit Google App Engine (Java 8) + Spring Boot + Gradle
Hallo Welt mit Google App Engine (Java 11) + Spring Boot + Gradle
Hallo Welt mit Google App Engine (Java 8) + Servlet API 3.1 + Gradle
Google AppEngine-Entwicklung mit Docker
Java 1 1-Unterstützung von Google App Engine
Verwenden der Eigenschaftendatei mit Flexible Environment Java 8 von Google App Engine
Ich kann nicht mehr mit der Google App Engine bereitstellen
Hallo, Welt mit Docker
Hallo Welt auf Flasche
PIL in Python unter Windows8 (für Google App Engine)
Zeichne Hallo Welt mit mod_wsgi
Hallo Welt mit Flask + Hamlish
Bis hallo Welt mit Zappa
Ich habe versucht, mich mit Spring Boot + Spring Security REST API anzumelden
Python beginnend mit Hallo Welt!
Hallo Welt! Mit virtueller CAN-Kommunikation
[Hinweis] Hallo Weltausgabe mit Python
Verwenden Sie ndb.tasklet mit Google App Engine
Hallo Welt! Von QPython mit Braincrash
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Java-Deploy Spring Boot-Projekt für GAE
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Greifen Sie mit Spring Boot auf Azure Cosmos DB zu
[Python] Führen Sie Flask in Google App Engine aus
[Google App Engine] Benutzerobjekte (japanische Übersetzung)
Verwenden Sie externe Module mit Google App Engine
Hallo Welt! Von QPython mit Brainfu * k
Ich habe Java8 + Spring Boot mit GAE SE (und seiner Entwicklungsumgebung) ausprobiert.
Eine Web-App, die Hello World nur mit dem net / http-Paket von Go ausführt