Java11の時代に実装されたSpring BootのアプリケーションはJava17でもworkするのか

## これはなんですか
俺はJava11をやめるぞジョ○ョー！

長いから結論を先に書いておきます。

**つこてるライブラリがものによってはworkできない。**

## 諸元
### Java 
* https://jdk.java.net/17/
* JDK 17 **Release-Candidate Builds** (2021-08-06)
* arch: macOS/x64

### PC
* Darwin bb.local 20.6.0 Darwin Kernel Version 20.6.0: Wed Jun 23 00:26:31 PDT 2021; root:xnu-7195.141.2~5/RELEASE_X86_64 x86_64
* MacOS Big Sur version 11.5.2

### Spring Bootその１(軽めのやつ)
* Spring Boot 2.5.0
* 実装されたJavaのclass及びinterface 40個くらい
* Dependencies

```
[INFO] +- org.springframework.boot:spring-boot-starter-actuator:jar:2.5.0:compile
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.5.0:compile
[INFO] +- org.springframework.boot:spring-boot-starter-web-services:jar:2.5.0:compile
[INFO] +- org.springframework.boot:spring-boot-starter-security:jar:2.5.0:compile
[INFO] +- org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:2.1.3:compile
[INFO] +- mysql:mysql-connector-java:jar:8.0.25:runtime
[INFO] +- org.springframework.boot:spring-boot-configuration-processor:jar:2.5.0:compile (optional) 
[INFO] +- org.projectlombok:lombok:jar:1.18.20:compile (optional) 
[INFO] +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.5.0:provided
[INFO] +- org.springframework.data:spring-data-commons:jar:2.5.1:compile
[INFO] +- org.springframework.boot:spring-boot-starter-test:jar:2.5.0:test
[INFO] +- io.springfox:springfox-swagger-ui:jar:2.8.0:compile
[INFO] +- io.springfox:springfox-core:jar:2.8.0:compile
[INFO] +- io.swagger:swagger-annotations:jar:1.5.21:compile
[INFO] +- org.springdoc:springdoc-openapi-ui:jar:1.5.4:compile
[INFO] +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.12.3:compile
[INFO] +- org.openapitools:jackson-databind-nullable:jar:0.2.1:compile
[INFO] +- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] +- ch.qos.logback:logback-access:jar:1.2.3:compile
[INFO] +- net.rakugakibox.spring.boot:logback-access-spring-boot-starter:jar:2.7.1:compile
[INFO] +- com.amazonaws:aws-java-sdk:jar:1.11.980:compile
[INFO] +- com.amazonaws:aws-java-sdk-logs:jar:1.11.980:compile
[INFO] +- com.amazonaws:aws-java-sdk-ec2:jar:1.11.980:compile
[INFO] +- com.j256.cloudwatchlogbackappender:cloudwatchlogbackappender:jar:2.1:compile
[INFO] +- com.googlecode.json-simple:json-simple:jar:1.1.1:compile
[INFO] +- org.flywaydb:flyway-core:jar:7.7.3:compile
[INFO] \- io.github.yoshikawaa.modelmapper.spring.boot:modelmapper-spring-boot-starter:pom:0.1.0:compile
[INFO]    \- io.github.yoshikawaa.modelmapper.spring.boot:modelmapper-spring-boot-autoconfigure:jar:0.1.0:compile
[INFO]       \- org.modelmapper.extensions:modelmapper-spring:jar:2.3.5:compile
[INFO]          \- org.modelmapper:modelmapper:jar:2.3.5:compile

```

## 手順
1. openjdkのサイトから対象のtar.gzを取得し下記に解凍

```
curl https://download.java.net/java/GA/jdk17/0d483333a00540d886896bac774ff48b/35/GPL/openjdk-17_macos-x64_bin.tar.gz
tar -xfvz openjdk-17_macos-x64_bin.tar.gz -C /Library/Java/JavaVirtualMachines
```

2. Macにインストールしてあるjdkを切り替える

$HOME/.bashrc

```
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk
PATH=$JAVA_HOME/bin:$PATH:~/development/flutter/bin:~/Library/Android/sdk/bin:~/Library/Android/sdk/tools/bin:~/Library/Android/sdk/platform-tools:/usr/local/opt/python@3.8/libexec/bin
```

確認    

```
bb:~ yamamotodin$ java -version
openjdk version "17" 2021-09-14
OpenJDK Runtime Environment (build 17+35-2724)
OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)
```

よし・・

3. IntelliJの設定

IntelliJに対しJDKを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/4de5b536-7083-b0bc-36e3-818be5740c8e.png)

プロジェクトで使うJDKを17にする（一瞬警告が出たような気がするけど見落とした・・）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/57b58326-19f2-56d8-b408-41252718af87.png)

グルグルボタン押してmaven設定の読み込み直し後、maven clean。

## 起動しよう spring-boot-run

`org.modelmapper:modelmapper:jar:2.3.5` で起動できないエラー。

```
[io/github/yoshikawaa/modelmapper/spring/boot/autoconfigure/ModelMapperAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.modelmapper.ModelMapper]: Factory method 'modelMapper' threw exception; nested exception is org.modelmapper.ConfigurationException: ModelMapper configuration errors:

1) Failed to instantiate proxied instance of jp.n-resolution.project.transaction.history.repository.entity.TransactionHistoryEntity. Ensure that jp.n-resolution.project.transaction.history.repository.entity.TransactionHistoryEntity has a non-private constructor.
```

これと同じ問題？

https://github.com/modelmapper/modelmapper/issues/254

modelmapperへダイブ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/0ad08e19-5fc2-d3f2-c97f-96d77337e3f4.png)

`java.lang.IllegalStateException: size = 2`

なんだろこれ・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570665/93945fd3-0559-8440-70dc-4cf483051a42.png)

メソッドが２つあるからダメ？　文脈的にコンストラクタのことかな・・？

だめだわからん。

別方向から攻める意味でほんとに対応してるのかどうかを見るため、changelog を参照
https://github.com/modelmapper/modelmapper/blob/master/CHANGES.md

```
2.3.6
New Features
Supports Java 13
```

dependency見ると2.3.5....か・・・
java17とかサポートされてなさそうっすね。

というわけで現状では**modelmapper関連がworkしない**を結論とします。

もしmodelmapperを使いたいならこの辺(`io.github.yoshikawaa.modelmapper.spring.boot:modelmapper-spring-boot-starter:pom:0.1.0`
)の依存を外して、modelmapperをauto configure無しのつるしで組むようにすること。
おそらくjava12か13あたりからworkしてなかったと思われる。

でも本家modelmapperのchangelogにjava17に正式対応したって話は書いてないので、差し替えても動くかどうかは未知数。

新規プロジェクトで modelmapperの最新版にして試してみるか・・
というわけで、現状では既存プロジェクトに対するjdkのアップデートはやらない方向にします。

なお、Spring Bootそのものはjava17でも動作することを確認しているので、純粋に使ってるライブラリによる事情であることを申し添えます。

この先はかすれていてよめない。