Spring Tool Suiteを使ってSpring Bootアプリを開発していて、JVM引数周りでちょっと困ったことになったので、覚書。2回ハマることは多分ないけど……。
[JVM引数に-noverifyが付与される]
AWSを利用して開発しているので、開発中は手元のマシンから各種AWSサービスにアクセスできるよう、JVM引数経由でアクセスキーIDとシークレットアクセスキーをアプリに渡している。
ところが、あるタイミングでアクセスキーIDが有効にならず、AWSサービスにアクセスできなくなる問題が発生した。調べてみると、-Daccess.key.id=MyAccessKeyId
のようにしてJVM引数を設定しているはずが、末尾に-noverify
という文字列が付与されていた。
System.out.println(System.getProperties());
を実行すると、...(略)..., user.country=JP, access.key.id=MyAccessKeyId-noverify
のようになってしまっていることが確認できた。
[回避策:ダミーJVM引数]
どこかでpropertiesファイルを別で定義していて、後から読み込まれたそのファイルがJVM引数で設定している値を上書きしているのではないか、といった推測もあったが、そのようなファイルは見つからず。
何度かJVM引数の設定を変更して試しているうちに、JVM引数の最後の引数にだけ-noverify
の文字列が付与されるらしいことが分かった。
そこで、JVM引数の設定を...(略)... -Daccess.key.id=MyAccessKeyId -Ddummy=argument
のように変更したところ、無事に目的にAWSサービスにアクセスすることができた。
System.out.println(System.getProperties());
を改めて実行すると、...(略)..., user.country=JP, access.key.id=MyAccessKeyId, dummy=argument-noverify
のようになっており、正しいJVM引数となっている。
[恒久対応:STSバージョンアップ]
もう少し詳しく調べてみると、Spring Tool Suite 3.9.0のバグであるらしかった。
JVMの起動を高速化するためのオプションの設定方法が誤っていたらしい。Spring Tool Suiteを再インストールすれば問題は発生しなそう。
そもそも最新のSpring Toolsは3系ではなく4系なので、そちらを使え、ということか。STS3系の公式サイトには、2019年半ばにEOL(End of Life)を迎え、サポートを終了するとの記載があった。
4系の公式サイトを見ると、おなじみのEclipse版に加えて、VS Code版とAtom版もあるらしい。VS Codeは最近Goの開発でも利用していて便利さを実感しているので、Spring Bootの開発にも利用していきたいところ。
[まとめ]
- STSでJVM引数に変な文字列(-noverify)が付与されたらダミー引数で回避できる
- STSをバージョンアップしても問題を回避できそう
- STS3系は2019年半ばにEOLを迎えるので移行が必要
- STS4系のVS Code版便利そうだから使ってみたい
しかし、STSのEOLは開発環境だからまだいいとしても、2019年4月にはNode.js 6.XがEOLを迎え、2020年1月1日にはPython 2.7もEOLを迎える。2019年のうちに、AWS Lambdaのランタイムとか、色々移行しないとなー。テストが大変そう。