Rendre l'environnement SpringBoot1.5 + Gradle4.4 + Java8 + Docker compatible avec Java11

Cet article est l'article du 15ème jour du Java Advent Calendar 2019.

introduction

Je l'ai laissé environ un an après l'expiration du support gratuit de Java 8 en janvier 2019, Depuis que j'ai le temps cette fois, j'ai mis à jour vers Java 11, qui est le premier LTS depuis 8. C'est un mémo à l'époque

J'ai essayé de commencer à écrire, mais il semble qu'OpenJDK 8 sera pris en charge jusqu'en juin 2023, donc J'aurais dû passer d'Oracle JDK à Open JDK ... Mais je l'ai fait alors je l'enregistrerai

Mise à jour JDK

Installez AdoptOpenJDK 11

Entrez la commande suivante pour installer le dernier JDK

brew cask install adoptopenjdk

Cependant, à l'heure actuelle, JDK13 est inclus, il est donc nécessaire de spécifier la version pour inclure la version LTS de JDK11. Rechercher la version publiée

$ brew search adoptopenjdk
==> Casks
adoptopenjdk                       adoptopenjdk11-openj9-jre          adoptopenjdk12-openj9              adoptopenjdk13-jre                 adoptopenjdk8                      adoptopenjdk8-openj9-large
adoptopenjdk10                     adoptopenjdk11-openj9-jre-large    adoptopenjdk12-openj9-jre          adoptopenjdk13-openj9              adoptopenjdk8-jre                  adoptopenjdk9
adoptopenjdk11                     adoptopenjdk11-openj9-large        adoptopenjdk12-openj9-jre-large    adoptopenjdk13-openj9-jre          adoptopenjdk8-openj9
adoptopenjdk11-jre                 adoptopenjdk12                     adoptopenjdk12-openj9-large        adoptopenjdk13-openj9-jre-large    adoptopenjdk8-openj9-jre
adoptopenjdk11-openj9              adoptopenjdk12-jre                 adoptopenjdk13                     adoptopenjdk13-openj9-large        adoptopenjdk8-openj9-jre-large

Puisque je veux installer JDK11 cette fois, spécifiez la version avec la commande suivante et installez

brew cask install adoptopenjdk11

Changer le PATH existant en JDK11

export JAVA_HOME=`/usr/libexec/java_home -v 11`

Vérifier la version

$ java -version
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.5+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.5+10, mixed mode)

Spécifiez JDK11 comme SDK de projet d'IntelliJ

Ouvrez la structure de projet avec Command + et spécifiez JDK 11 pour Project SDK et Project Language Lebel.

Mettre à jour Gradle

Gradle 4.4 ne prend pas en charge le JDK 11, il doit donc être mis à jour Il semble que les versions 5.0 et ultérieures soient prises en charge, mais comme c'est une bonne idée, je vais essayer d'en faire la dernière version 6.0.1 actuelle

Mettre à jour gradle-wrapper.properties

La mise à jour de la version répertoriée dans gradle / wrapper / gradle-wrapper.properties modifiera la version de Gradle appliquée à votre projet. Cette fois, changez simplement la partie 4.4 suivante en 6.0.1.

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip

Mettre à jour gradlew

Cela seul ne propagera pas les changements à gradlew, donc régénérez gradlew

./gradlew wrapper

Gradle.build mis à jour

Remplacez diverses bibliothèques de framework par celles compatibles avec JDK11 Fondamentalement, tout est décrit dans gradle.build, vous pouvez donc le modifier

Modifier la spécification de version Java

La signification de chaque spécification est décrite dans Officiel, alors spécifiez ce dont vous avez besoin.

sourceCompatibility = 11
targetCompatibility = 11

Modification de la méthode de description de la série Gradle 6

Mis à jour car la méthode de spécification du pot a changé Voir Officiel pour plus de détails.

jar {
    baseName = 'example'
    version = '1.0.0-SNAPSHOT'
}

Changé ce qui était ci-dessus en dessous

bootJar {
    archiveBaseName = "example"
    archiveVersion = "1.0.0-SNAPSHOT"
}

Changer la version de Spiring Boot

Spring Boot 2.1.x ou supérieur est requis pour utiliser Java 11 Comme c'est une bonne idée, je vais essayer d'en faire la dernière version 2.2.2 En gros, suivez le Guide officiel de migration.

buildscript {
    ext {
        springBootVersion = '1.5.13.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

Spring Boot n'applique plus automatiquement le plug-in de gestion des dépendances, alors ajoutez également le plug-in

apply plugin: 'io.spring.dependency-management'

Depuis que la méthode de spécification de la classe principale a changé, cela a également changé

springBoot {
    mainClassName = "jp.co.example.Application"
}

Mettre à jour la version de la bibliothèque

Mettez à jour la version de la bibliothèque en consultant MavenRepository

Bibliothèque autour de Spring Boot

Il est plus facile de spécifier la version de la bibliothèque autour de Spring Boot avec une variable Cependant, veuillez noter que certaines versions peuvent différer de la version Spring Boot.

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
    compile("org.springframework.boot:spring-boot-starter-jdbc:${springBootVersion}")
    compile("org.springframework.boot:spring-boot-starter-security:${springBootVersion}")
    compile("org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}")

    testCompile("org.springframework.boot:spring-boot-starter-test:${springBootVersion}")
    testCompile("org.springframework.security:spring-security-test:5.2.1.RELEASE")
}

lombok

Étant donné que la méthode de spécification de la dépendance a changé, si vous ne spécifiez normalement que la version et la mise à jour, une erreur se produira si la méthode automatiquement générée par lombok au moment de la construction n'est pas trouvée Reportez-vous à Officiel et ajoutez les spécifications suivantes

compileOnly('org.projectlombok:lombok:1.18.10')
annotationProcessor('org.projectlombok:lombok:1.18.10')

De plus, lorsque j'utilise @Value, j'obtiens une erreur indiquant que la désérialisation dans Jackson ne fonctionne pas bien. Cela peut être évité en créant un fichier appelé lombok.config directement sous le projet et en décrivant ce qui suit. D'autres paramètres sont décrits dans le Guide officiel de migration.

lombok.addJavaxGeneratedAnnotation = false
lombok.addLombokGeneratedAnnotation = true
lombok.noArgsConstructor.extraPrivate = false
lombok.anyConstructor.addConstructorProperties = true

config.stopBubbling = true

jjwt

Parce qu'il repose sur des API obsolètes Java 11 lors de l'utilisation de certains algorithmes Si vous l'utilisez à partir de Java 8 et avez migré vers Java 11, vous devez ajouter une dépendance Ajoutez ce qui suit en vous référant à Officiel

compile('javax.xml.bind:jaxb-api:2.3.0')
compile('com.sun.xml.bind:jaxb-core:2.3.0')
compile('com.sun.xml.bind:jaxb-impl:2.3.0')

Autre

Mettre à jour en bon N'oubliez pas de mettre à jour les bibliothèques spécifiées dans d'autres que les dépendances. J'ai oublié de mettre à jour jacoco et j'ai perdu mon temps

Prend en charge les API obsolètes dans Java 11

Cet article sera utilisé comme référence pour corriger l'API obsolète.

Correction des classes obsolètes dans SpringBoot 2.0

Quand j'essaye de le construire, il y a plusieurs classes obsolètes autour de Spring Boot, donc je vais le réparer Reportez-vous au Guide officiel de migration

Cette fois, seules les classes autour de org.springframework.boot.autoconfigure.web qui contrôlaient le message d'erreur ont été ciblées. La méthode suivante

@RequestMapping(value = "/error")
public ErrorResponse error(HttpServletRequest request, HttpServletResponse response) {
  ServletRequestAttributes attributes = new ServletRequestAttributes(request);
  Throwable error = errorAttributes.getError(attributes);
  return convertException(error);
}

fais ça

@RequestMapping(value = "/error")
public ErrorResponse error(WebRequest request) {
  Throwable error = errorAttributes.getError(request);
  return convertException(error);
}

Essayez de tester

Si vous faites jusqu'à présent, la construction passera pour le moment, alors lancez le test et vérifiez si un dégraissage s'est produit. Il ne semble pas y avoir de problème particulier cette fois Nous reporterons la résolution de Warn et viserons à déployer l'application compatible JDK11 sur Docker pour le moment.

Modifier le Dockerfile

Dockerfile n'a besoin que de changer l'image de base Cet article vous aidera à décider quelle image choisir. Comme recommandé cette fois, sélectionnez adoptopenjdk / openjdk11: alpine-slim

FROM adoptopenjdk/openjdk11:alpine-slim

Autre

Modifier les paramètres CircleCI

Si vous utilisez l'outil CI / CD, assurez-vous de modifier également ce paramètre. Il est facile d'oublier de spécifier l'image de base lors de la construction de l'environnement de test.

SpringBootActuator

Veuillez noter que le préfixe / actuator a été ajouté à tous les points de terminaison générés automatiquement par SpringBootActuator. Le déploiement ne fonctionne pas, en particulier lors de l'utilisation de / health Pour d'autres modifications, reportez-vous à Cet article

à la fin

Avec les modifications ci-dessus, vous devriez être prêt à déployer pour le moment. Si un problème survient, je l'ajouterai le cas échéant Veuillez me faire savoir s'il y a quelque chose comme "cette façon d'écrire est correcte" ou "cela peut causer des bogues".

référence

Installez AdoptOpenJDK11 avec homebrew sur mac

Notes sur la mise à jour de la version du wrapper Gradle

Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0

Spring Boot 2.0 Migration Guide

Lombok Project

Pensez aux images Docker recommandées après la version Java 11

Spring Boot 2.0 Actuator, 3 changements à connaître pour le faire fonctionner

Ce que les ingénieurs Java doivent préparer pour la version Java 11

ObjectMapper can't deserialize without default constructor after upgrade to Spring Boot 2

Lombok Changelog

Recommended Posts

Rendre l'environnement SpringBoot1.5 + Gradle4.4 + Java8 + Docker compatible avec Java11
Préparer un environnement de scraping avec Docker et Java
Comment créer un environnement Docker avec Gradle pour IntelliJ
Rendre les gadgets de calendrier créés avec JavaFX compatibles avec Java SE 9
[Note] Créez un environnement Java à partir de zéro avec docker
Créer un multi-projet Java avec Gradle
[Docker] Construction de l'environnement Rails 5.2 avec docker
Créer un environnement Docker avec WSL
Utilisation de Docker depuis Java Gradle
Hello World avec SpringBoot / Gradle
Écrivons comment créer une API avec SpringBoot + Docker à partir de 0
Créez un environnement pour Rails5 et postgresql avec Docker afin que pgadmin puisse également être utilisé
Créez un environnement Vue3 avec Docker!
Créer un environnement local Couchbase avec Docker
Construire un projet Java avec Gradle
Installer Java avec Docker basé sur Ubuntu 16.04
Créer un environnement Node.js avec Docker
Construction d'environnement avec Docker pour les débutants
Préparer l'environnement de développement Java avec Atom
Transformez facilement les applications Java en Docker avec Jib
Créer un environnement de vérification SolrCloud avec Docker
[Construction de l'environnement avec Docker] Rails 6 et MySQL 8
Faites fonctionner Jupyter Lab n'importe où avec Docker
[Java & SpringBoot] Construction de l'environnement pour Mac
Créez un environnement Docker + Laravel avec Laradock
Changer d'environnement avec l'argument de démarrage dans SpringBoot
Préparer l'environnement de développement Java avec VS Code
[Java] Créer un module exécutable avec Gradle
Construction de l'environnement GPU avec Docker [version d'octobre 2020]
Construction d'environnement de rails avec Docker (apocalypse personnelle)
Construction de Rails 6 et environnement PostgreSQL avec Docker
Construction de l'environnement de développement Laravel avec Docker (Mac)
Créer un environnement de développement PureScript avec Docker
Construire un environnement Rails 6 + MySQL avec Docker compose
Créez quelque chose comme Enum de Java avec Typescript
Obtenez un cryptage compatible OpenSSL avec Java / PHP
Modifier Mysql avec des commandes dans l'environnement Docker
Application Java CICS-Run - (3) Gestion de build avec Gradle
Création d'un environnement de développement pour les applications Web Java avec Docker pour Mac Part1
Créer un environnement de développement Spring Boot-gradle-mysql avec Docker
[Java] Connexion avec la base de données locale (IntelliJ + SpringBoot)
[Docker] Créez un environnement Node.js + express + webpack avec Docker
Construction de l'environnement de développement Java Spring Boot + Docker
[docker] [nginx] Créer un ALB simple avec nginx
Construire un environnement pour Laravel + MySQL + phpMyadmin avec Docker
Créer un environnement de développement Wordpress avec Docker
[Docker] Construisez l'environnement d'exécution de Jupyter Lab avec Docker
Présentation du test Java automatisé avec JUnit 5 + Gradle