[JAVA] L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2

introduction

Salut, c'est @chan_kaku Dans l'article précédent ici, j'ai parlé de passer de la série Spring Boot 1.5 à la série 2.1. Cette fois, je voudrais évoquer les difficultés que j'ai rencontrées lorsque j'ai effectué une migration à grande échelle suite à la migration précédente.

Pourquoi écrivez-vous des articles similaires

Pour le service cible que j'ai écrit dans l'article précédent, j'ai choisi celui avec le moins de bibliothèques dépendantes possible afin de connaître à l'avance les points auxquels je pourrais être accro en tant qu'étape préliminaire au service qui est la cible de cette migration. C'était. Le service cible dépend cette fois de Spring Cloud, etc., il y avait donc de nombreux points addictifs différents de la fois précédente, j'ai donc décidé de l'écrire à nouveau.

Ce que j'ai fait (aperçu)

--SérieGradle3 → Série Gradle5 --Spring Boot 1.5 series → Spring Boot 2.1 series --Mise à niveau d'autres bibliothèques dépendantes

Quant à ce que j'ai fait, j'ai l'impression qu'il y a beaucoup de choses que je porte au début. Dans cet article, j'écrirai les différences par rapport au précédent.

Série SpringBoot 1.5 → Série Spring Boot 2.1

La dernière fois, la mise à niveau de la version de Spring Boot elle-même n'a été résolue qu'en ajoutant ʻio.spring.dependency-management`. Cependant, Spring Cloud a été le changement majeur de la série 1.5 à la série 2.1.

Changer 1

Feign Client était l'un des Spring Clouds qui a connu un changement radical. En premier lieu, la configuration du package a changé comme suit

- import org.springframework.cloud.netflix.feign.FeignClient;
+ import org.springframework.cloud.openfeign.FeignClient;

À l'origine, il utilisait le client Feign de Netflix, mais il a été remplacé par le client Feign d'Open Feign. Parallèlement à cela, l'interface a changé et il est nécessaire de corriger cette zone. (Pour FeignClientException)

Puisqu'il s'agissait d'un composant qui se connecte à des services externes, nous l'avons soigneusement testé ici.

Changement 2

Le prochain changement concerne la source de données par défaut dans Spring Boot. Tomcat JDBC a été utilisé par défaut dans la série 1.x. Cependant, HikariCP est utilisé par défaut à partir de la série 2.x. Maintenant que ce Hikari CP est utilisé, une erreur est survenue. Une erreur s'est produite car la version de HikariCP utilisée dans la série SpringBoot 2.x et la version de HikariCP utilisée dans d'autres bibliothèques dépendantes sont différentes. L'histoire ici a également été mentionnée dans [numéro] de Spring Boot (https://github.com/spring-projects/spring-boot/issues/16656), alors pourquoi ne pas y jeter un coup d'œil?

approche

Cette fois, je savais que l'erreur était due à une version différente de HikariCP, alors j'ai deviné que la version de Spring JDBC était différente quelque part. Cependant, je ne savais pas quelle version de Spring JDBC était la plus ancienne, j'ai donc utilisé la commande Gradle dependencies. Cette tâche est une commande qui peut être exécutée avec gradle sans ajouter de dépendance, et peut être exécutée comme suit

./gradlew dependencies

Vous pouvez vérifier l'arborescence des dépendances en exécutant cette commande! J'ai regardé l'arborescence de dépendances générée par cette commande et j'ai trouvé une version plus ancienne de la bibliothèque, j'ai donc pu résoudre l'erreur en excluant Spring JDBC de là. Plus précisément, la version de Spring JDBC dont dépendait la dernière version de ʻorg.seasar.doma.boot: doma-spring-boot-starter` était ancienne, donc je l'ai résolue en excluant Spring JDBC comme suit.

build.gradle


implementation("org.seasar.doma.boot:doma-spring-boot-starter:1.1.1") {
        exclude group: "org.springframework.boot", module: "spring-boot-starter-jdbc"
}

Des choses qui n'ont pas encore été résolues

Avec la solution de contournement ci-dessus, vous pouvez maintenant exécuter le fichier jar. Cependant, lorsque j'exécute bootRun à partir de gradle, j'obtiens l'erreur suivante:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
        at jp.furyu.hoge.api.HogeApiApplication.main(HogeApiApplication.java:14)
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

Dans ce projet, classPath est réécrit avec l'option bootRun, mais cela est réécrit car il semble qu'une erreur se produira dans Windows lorsqu'il existe de nombreuses dépendances de ce projet. Autour d'ici a plus de détails, alors jetez un œil! Il semble que bootRun ne soit pas possible en raison de cette réécriture de classPath, mais je ne connais pas la solution et elle est actuellement sous enquête (juillet 2019). Je l'ajouterai dès que je trouverai une solution!

Post-scriptum (2019/8/8)

Lors de la dénomination du jar, jusqu'à présent, il était décrit comme suit dans l'option jar de build.gradle

build.gradle


jar {
    archiveBaseName = "hoge"
    archiveFileName = "${archiveBaseName}.jar"
    version = "1.0.0"
}

Il n'y a pas de problème lors de la création d'un fichier jar localement, mais lors de la création d'un fichier jar avec CI, le nom racine du projet peut être différent, et cette ʻarchiveBase.jar` n'est pas devenue un phénomène. Par conséquent, lorsque je voulais utiliser le nom de fichier jar spécifié dans l'environnement CI, la solution de contournement que j'ai prise cette fois était d'ajouter settings.gradle comme suit.

settings.gradle


rootProject.name = 'hoge'

En ajoutant rootProject.name à settings.gradle, le nom du fichier jar ne changera pas même dans l'environnement CI.

finalement

La série SpringBoot 1.5.x sera EOL en août 2019, donc si vous ne l'avez pas encore supportée, vous devriez vraiment vous dépêcher, alors j'espère que cet article sera utile pour tout le monde!

Recommended Posts

L'histoire de la montée de Spring Boot de la série 1.5 à la série 2.1 part2
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
L'histoire de la transition de Spring Boot 1.5 à 2.1
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
Essayez Spring Boot de 0 à 100.
Introduction à Spring Boot, partie 1
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
À propos de la fonction de Spring Boot en raison de différentes versions
Une histoire remplie des bases de Spring Boot (résolu)
Spring Boot à partir de zéro Partie 2
Spring Boot à partir de zéro Partie 1
Je veux contrôler le message d'erreur par défaut de Spring Boot
L'histoire de la rencontre avec l'annotation personnalisée Spring
L'histoire de RxJava souffrant de NoSuchElementException
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
[Spring Boot] J'ai étudié comment implémenter le post-traitement de la demande reçue.
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
L'histoire du passage d'Amazon RDS pour MySQL à Amazon Aurora Serverless
Changez l'espace demi-largeur de STS (Spring Tool Suite) de "u" à "・"
L'histoire de l'introduction de la communication Ajax à Ruby
Vérifions la sensation de Spring Boot + Swagger 2.0
L'histoire de l'ajout du dernier Node.js à DockerFile
[Spring Boot] Comment se référer au fichier de propriétés
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Spécifiez le codage des ressources statiques dans Spring Boot
De l'introduction de la conception à la création de la table des utilisateurs
Comment écrire Scala du point de vue de Java
Un mémorandum de dépendance à Spring Boot2 x Doma2
Accédez au h2db intégré de Spring Boot avec jdbcTemplate
Jusqu'à l'utilisation de Spring Data et JPA Part 2
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Jusqu'à l'utilisation de Spring Data et JPA Part 1
Déployer le projet Spring Boot sur Tomcat dans XAMPP
Comment démarrer par environnement avec Spring Boot de Maven
Un record d'étude du Spring Framework à partir de zéro
[Vérification de comparaison] Quelle est la différence entre la productivité du développement de l'application Spring Boot et celle du passé?
[Spring Boot] L'histoire selon laquelle le bean de la classe avec l'annotation ConfigurationProperties n'a pas été trouvé
Accédez à l'abréviation à partir de 5 exemples de listes Java en italique
Déployez des applications Spring Boot sur Heroku sans utiliser la CLI Heroku
20190803_Java & k8s sur Azure L'histoire d'aller au festival
[Java] Déployer l'application Spring Boot sur Azure App Service
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
L'histoire du lancement de données BLOB depuis EXCEL dans DBUnit
Déployez l'application créée par Spring Boot sur Heroku (public) ②
Introduction à Spring Boot ① ~ DI ~
Comment obtenir les informations les plus longues de Twitter à partir du 12/12/2016
Introduction à Spring Boot ② ~ AOP ~
Déployez l'application créée par Spring Boot sur Heroku (public) ①
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
[Apache Tomcat] L'histoire de l'utilisation d'Apache OpenWebBeans pour activer CDI
Une histoire qui m'a fait regretter quand une "NotReadablePropertyException" s'est produite pendant le développement de l'application Spring Boot.
Depuis que je suis passé de Spring Boot (Java) à Ruby on Rails, j'ai résumé mes points préférés de Rails
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot