JibでLayer architect な Spring Boot Applicationをdocker imageにする
Spring Boot ApplicationをDocker image化する手段として
等があります。(あります、とか大上段からものを言っていますが、ここ1週間くらいで仕入れた知識です。私はクソ雑魚です。)
Spring Boot 2.3.0からmvn spring-boot:build-imageでCloud Native Buildpackを使ったdocker imageが作成できるようになるらしく 今後のデファクトはCloud Native Build Packになりそうな予感があります。
とりあえず、一番簡単そうなJibを試しました。Build Packはその次に勉強する予定です。
今回から3回くらいにわたって、Jibでハマったところを記事に残していきます。
amazon-corretto-11をbrew cask upgrade したら trustAnchors parameter must be non-empty が出るようになった
$ brew cask reinstall corretto $ echo $JAVA_HOME 火 1/21 11:36:24 2020 /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home $ java -version 火 1/21 11:36:27 2020 openjdk version "11.0.6" 2020-01-14 LTS OpenJDK Runtime Environment Corretto-11.0.6.10.1 (build 11.0.6+10-LTS) OpenJDK 64-Bit Server VM Corretto-11.0.6.10.1 (build 11.0.6+10-LTS, mixed mode)
でgradle buildするとhttps接続するところで以下のようなメッセージが出てエラーとなりました。
trustAnchors parameter must be non-empty
amazonが配布しているtar.gzを落として確認したところ、cacertsのサイズが結構違っていたので置き換えてみました。
$ pwd /Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home/lib/security $ ls -l -rw-r--r-- 1 root wheel 252168 1 21 11:17 cacerts # tar.gzに入っていたもの -rw-r--r-- 1 root wheel 160340 1 15 06:21 cacerts_bk # brew でインストールしたもの
一応これで動くようになりました。おま環かもしれないし、動くようになったので深追いしない😑
コンテナに存在するかわからないBeanをAutowiredする
Constructor Injection
class Foo( private val bar: Bar? ) { }
Field Injection
class Foo { @Autowired(required = false) lateinit var bar: Optional<Bar> }
前回の記事に関連して小ネタ。@Autowired(required = false)
を知らなかったのでメモ。
Constructor Injectionを使わない場合、@Autowired(required = false)
として、Optionalで定義することができる。
KotlinでOptionalを使うのはもったいないので、できるだけConstructor Injectionを使う方が良さそうです。
参考
Spring Boot × Gradleで自作ライブラリを作る
Spring Bootで自作ライブラリを1から作ったことがなかったので試してみました。
作成するライブラリ
文字列を引数で与えるとPrefixをつけて返してくれるMyTextDecorator
を作成します。
さらにadditionalを定義することで追加で文字列を付けてくれます。
github star 5,000超え待ったなしのスーパーライブラリですよこいつはぁ。
利用方法
# application.yml mylibrary: text: prefix: my-prefix additional: enabled: true prefix: additional
@Service class DemoService( private val myTextDecorator: MyTextDecorator ) : DemoUseCase { override suspend fun getSampleModel(): DemoUseCase.Output { val text = myTextDecorator.decorate("demo") println(text) // -> my-prefixadditionaldemo return DemoUseCase.Output(text) } }
やること
- mylibrary.text.prefix を読み込んでBeanを生成する
- mylibrary.text.additional.prefix を読み込んで条件に応じてBeanを生成する
- MyTextDecorator.ktをBeanに登録する
- spring.factoriesを用意する
- jarに固める
- 利用者側に取り込む
2019年振り返りと2020年
年始から風邪に倒れ、10日たった今も全く治る気配がありません。ずっと寝ていて暇なのでこのブログを書いています。今年はのっけから暗礁に乗り乗りで絶望しかない感じ。
2019年の概括
デレステが前よりうまくなった、くらいしか成長がないです。Lv27 Masterがフルコンできるようになってきました。やったぜ。 音ゲー初心者でも2年近く昼休みにプレイしているだけでここまで成長するんだから、継続は力なりです。 プレイ当初はLv17 Proすらクリアできなくて端末をベッドに投げ捨てていたものですが。
あとミリシタもはじめました。2ヶ月くらいプレイして、やっと全曲解放できました。琴葉好き。
仕事
2019年の春くらいから残業を一切しないという個人的な働き方改革をしています。それまでは50時間弱くらい残業していました。 おかげで心身に余裕ができて、一時期停滞していた登山にまたいけるようになりました。今年も継続したいです。収入減ったけど。
2019年12月に2年近く続けていたプロジェクトが無事リリースされ、と同時に自分の会社内での存在価値が一旦リセットされました。 今まで「技術力は無いしコミュ力も低いがムダに長い社歴から来る闇の業務知識で要所の開発にちょっとだけ必要だった長老的ポジション」として、なんとか職場に居場所を作っていましたが、今年は「技術はないしコミュ力もないロートル」スタートです。 厳しい戦いが予想されますが心を壊さない程度に働きたいです。なんと思われようが、お金が入ってくればそれで良いのだ。
趣味
数回はテントを担いた縦走をしたい。あとロードバイクを買ったので輪行もしたい。 いい加減体調不良以外の理由で有給休暇を取りたいです。
ブログ
なんか思ったより長く運営できたので今年も月2本くらいは技術的な何かを残していきたいです。元々今の仕事をやめたくて仕方のない時に「転職活動の際のポートフォリオとして使えるといいなあ」と思ってはじめましたが、上みたいなやる気のない文章を書き始めたのでもうそういったポジティブな活動には使えないです。もうどうにでもなーれって状態になったので、もっと自由に色々書けるといいなあと思います。
Configuration annotationのproxyBeanMethodsとBean Lite Modeについての備忘録
記事の概略
- SpringのBeanにはBean Lite Modeというものがある
- Spring 5.2から@Componentの代わりに@Configuration(proxyBeanMethods = false)を指定することでBean Lite Modeにできる
- CGLIB Proxyが不要ならパフォーマンスがよくなる
- https://github.com/spring-projects/spring-boot/issues/9068 を読めば大体わかる
以下は自分の勉強の備忘録になります。上のissueが完璧なのであんまり読む価値ない。