SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

STS3(Spring Tool Suite)とSpring Bootのバージョンアップで既存プロジェクトのハマりどころ

STS3(Spring Tool Suite)とSpring-bootのバージョンアップ自体は、Mavenベースでやっていると比較的容易にできますが、若干、はまりどころがあります。

今回はそれをまとめます。

なお、この記事はSpringTools3(STS)3前提になっていますので、ご容赦ください。

 

2018/10/3追記

STSの最新版は4になっているみたいです。

f:id:arakan_no_boku:20181003213539j:plain

 

ハマったエラー

 

今回ハマったエラーは以下の3つです。

  • pom.xmlのエラー
  • Maven installなどの実行時エラー
  • Spring Bootアプリケーションの実行時エラー

 

pom.xmlのエラー

 

時点(2017/12/03)の最新版「2.0.0.M6」に「spring-boot-starter-parent」をあげようと思いました。 

すると、pom.xmlにこのようなエラーがでます。

プロジェクト・ビルド・エラー: Non-resolvable parent POM for jp.bkjudg:bkjudg:0.9: Failure to find org.springframework.boot:spring-boot-starter-parent:pom:2.0.0.M6 in https://
repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced
and 'parent.relativePath' points at no local POM

 ローカルリポジトリにキャッシュされていない? 

ちょっと引っかかったのですが、とりあえず、エラーがとれないので、バージョンを少しずつさげて、1.5.8.RELEASEでエラーがなくなりました。 

少々、気持ち悪いのですが、これはMavenのローカルキャッシュを更新しないとダメだということはわかったので、Maven installをやり直してみれば良いかな・・と考えたわけです。

 

Maven installなどの実行時エラー

 

Maven installを実行してみました。

f:id:arakan_no_boku:20171204222245j:plain

なんと、今度はJDKが見つからないからコンパイルできない・・というエラーが。 

意味がわからない・・と思って、環境変数を調べてみると、自分で設定し覚えのない「C:\ProgramData\Oracle\Java\javapath」という記述が先頭に来てます。 

どうも、これが悪さをしているのではないか?と思って、調べるとこんな記事がありました。

daregada.blogspot.jp

JAVA8になってから、JAVAの自動更新で勝手にパスを追加して、おかげでJDKのパスが見えなくなってるんですね。 

余計なことするなあ・・と、ボヤきつつ、上記の記事を参考に環境変数のパスを修正して、STSを再起動して・・、なんとか、MAVEN INSTALL は終わりました。

 

Spring Bootアプリケーションの実行時エラー

 

ここで、ふと不安になりました。 

どうも、今回は予想外のところでハマり続けているので、他も大丈夫か?・・と。 

それで一応、1.5.8.RELEASEのままで、Spring Bootアプリケーションの実行をやってみました。 

案の定・・。 

コンソールには無情の例外が。

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication

ところが、不思議なことに以下のような現象が。

  • 新規にプロジェクトを作ると同じSpring-bootのバージョンでもアプリケーションの実行エラーにならない。
  • spring-boot-starter-parentのバージョンを、1.5.4.RELEASEに戻すとなんの問題もなく実行できる

そこから、約1日ハマりました。 

で、原因なんですけど・・、意外なものでした。 

STSのバージョンを新しいものに更新してから、spring-boot-starter-parentの既存のプロジェクトを変更しようとすると、こういう事が起きるみたいなのですね。

stackoverflow.com

その回答を訳します(Google翻訳です)

新しいSpring Starter Projectを作成してください。 File-> New-> Spring Start Projectに進みます。そして、最新の親バージョンを取得するデモプロジェクトを作成し、すべてのバージョンが動作するようにバージョンを変更します。 私はSTSを変更するたびにこれを行います。

 自分もこれを参考にして、時点のspring-boot-starter-parentの最新バージョン「2.0.0.M7」で新規プロジェクトを作り直し、1.5.4.RELEASEで動作させていたものを移植しました。

 

まとめます

 

STS(Spring Tool Suite)の更新自体は問題ありません。 

常に最新バージョンにするべきだと思います。 

しかし、STSのバージョンをあげても、既存プロジェクトのspring-boot-starter-parentのバージョンだけを上げるのは、うまくいきません。

Spring-Bootアプリケーションの実行でエラーが発生するリスクがあります。 

今のところ、SpringBootのバージョンをあげるには、新規スタータープロジェクトを作り直し、既存プロジェクトからソースを移植する以外に方法がないみたいです。 

ある程度大きなシステムになると、既存プロジェクトで、SpringBootのバージョンをあげるのは、それなりの工数を見込んでおいたほうが良さげです。

いやはや、疲れました。