【Flutter】Javaのバージョンを上げるのにハマった

# はじめに
### Javaのバージョンを上げることになった経緯
[package_info_plus](https://pub.dev/packages/package_info_plus)のバージョンを上げると、下記のようなエラーが出ました。
```
Execution failed for task ':package_info_plus:compileDebugJavaWithJavac'. > エラー: 17は無効なソース・リリースです
```

調べたところ、下記のIssueがヒットし、どうやら、[package_info_plus](https://pub.dev/packages/package_info_plus)の`6.0.0`以降では、Javaのバージョン１７が必要みたいです。
https://github.com/fluttercommunity/plus_plugins/issues/2809

パッケージのCHANGELOGにも書いてありました。

https://pub.dev/packages/package_info_plus/changelog#600

そこでJavaのバージョンを上げたのですが、ビルドが通らず、`flutter doctor -v`で確認したところ、Javaのバージョンが11を参照しているみたいでした。

```
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /Users/xxxx/Library/Android/sdk
    • Platform android-34, build-tools 33.0.0
    • Java binary at: /Applications/Android
      Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
    • All Android licenses accepted.
```

したがって、Flutterで使用するJavaのバージョンを上げる必要があるみたいで、下記の記事を参考にし、実行してみたのですが、解決できず。

https://zenn.dev/takuowake/articles/a11fa216cc59f9

https://zenn.dev/sd7jp/articles/763c84e398c6c7

https://qiita.com/y-matsumoto/items/74467e528c7b2c745b87

# Flutterで使用するJavaについて
`flutter config`で、Flutterの設定ができるようですが、そのオプションにAndroid SDKのパスや、Javaのパスを指定するところがありました。
| option | 内容 |
| ---- | ---- |
| --android-sdk | The Android SDK directory. |
| --android-studio-dir | The Android Studio installation directory.If unset, flutter will search for valid installations at well-known locations. |
| --jdk-dir | The Java Development Kit (JDK) installation directory. <br/>If unset, flutter will search for one in the following order:<br/>1) the JDK bundled with the latest installation of Android Studio, <br/>2) the JDK found at the directory found in the JAVA_HOME environment variable, and <br/>3) the directory containing the java binary found in the user's path. |

`--jdk-dir`の説明では、AndroidStudio → JAVA_HOME　→ PATHの順番でJavaのパスを確認するみたいでした。

おそらく、何もしてなければ、AndroidStudioのJavaを使用していると思うので、AndroidStudioのJavaのバージョンを上げれば、Flutterで使用するJavaのバージョンも上がります。
プロジェクトによっては、Javaのバージョンを上げるとビルドできなくなる場合もあると思うので、Javaのバージョン管理をどうすればいいかについては、別途調べたいなと思っています。

冒頭に書いた私がはまったポイントで、
Javaのバージョンを上げたのに、`flutter doctor -v`で確認しても、Javaのバージョンが上がらなかったのは
上記の参照の順番で、AndroidStudioのJavaが参照されていたことでした。

ただ、他の記事を見ていると、Homebrewを使用して、指定のJavaのバージョンをインストールして使用する手順が書いてあったので、AndroidStudioのJavaを使わない方法もあるみたいです。

# 解決方法
私の場合は、AndroidStudioをアップデートすると、同梱されているJavaのバージョンも上がり、ビルドできるようになりました。

# おまけ
## パスを通すについて
Javaをインストールするときに、.zshrcというファイルでパスを通す必要があります。
今まで、パスを通すのに、よく理解しないまま使っていたので、理解するために調べました。
bashの方は、.bashrcとなります。

### bashとzshについて
Macだと、`bash`か`zsh`というシェルを使っています。
シェルとはコンピューターを操作するためのプログラムです。
`bash`と`zsh`の違いについては、`zsh`は`bash`の高機能版という位置付けのようです。
シェルについて、イメージを掴むには下記の記事が参考になりました。

https://zenn.dev/k_log24/articles/582af625164d41

Macのユーザーで、どちらを使っているのか？を確認するには、以下のコマンドをターミナルなどで、実行すると確認できます。

```zsh
echo $SHELL
```

### .bashrcと.zshrcについて
rcは、「Run Command」の略のようで、zshを実行するためのコマンドという意味みたいです。
上記だと、個人的には少しわかりにくかったのですが、zshを実行するときの設定ファイルみたいな意味合いだと理解しています。
下記の記事がすごく参考になりました。

https://qiita.com/ishidao/items/769b2e9acfc2ce4542b6#z%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF%E3%81%AA%E3%82%93%E3%81%9E%E3%82%84

.zshrcで、`export PATH=$PATH:通したいパス`を書いておくと、書いておいたPATHが通った状態でzshを実行できるということになります。

https://note.com/standenglish/n/ne9825624fe93

### PATHとは

PATHとは、実行ファイルの場所という意味合いで理解しています。
なので、PATHを通すというのは、実行ファイルの場所を登録することという認識です。
PATHを.zshrcに登録しておかないと、コマンドを実行しても、実行ファイルの場所がわからないためエラーになります。
逆にいうと、実行ファイルをそのまま実行するなら、PATHは必要ないということでもあります。

例えば、フォルダの中身を調べるのに、`ls`というコマンドがありますが、lsという実行ファイルは`/bin`フォルダの中にあります。

試しに以下のコマンドを実行すると、lsというファイルがあるはずです。
```zsh
ls /bin
```

`/bin`は、デフォルトでPATHに登録されているみたいです。
PATHの一覧は、以下で確認できます。
```zsh
echo $PATH | sed -e 's/:/\n/g'
```

`/bin`が登録されているおかげで、`ls`だけで`lsコマンド`が使えるということになります。
しかし、`ls`の場所は、`/bin/ls`であることがわかったので、フルパスを指定して以下の形でも実行できます
```zsh
/bin/ls
```

実行結果は、`ls`と同じです。

詳しく知りたい方は、以下の記事がわかりやすくおすすめです。

https://qiita.com/ishidao/items/769b2e9acfc2ce4542b6#path%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%AA%E3%81%AE%E3%81%8B

## シンボリックリンク
Flutterで使うJavaのバージョンを上げる際に調べた記事中でシンボリックリンクを作成するという手順がありました。
シンボリックリンクとは？という状態になったので、調べました。

### 概要
シンボリックリンクとは、簡単にいうと、ショートカット。フォルダやファイルパスの代わりになるものというイメージです。
実際に作り方を見ると、理解しやすいと思います。

### 作り方
作成コマンドは下記になります。

```
ln -s <リンク対象のパス> <作成するリンクのパス>
```

実際に使ってみたいと思います。
まず、テスト用のファイルとして`faisofhasghafeafafdsa.txt`を作成しました。
```zsh
echo "link" >> faisofhasghafeafafdsa.txt
```

`cat`コマンドを実行し中身を見ると以下のようなファイルになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/0580ada4-b40e-b29e-ad1e-ca0b43d91eb8.png)

続いて、`faisofhasghafeafafdsa.txt`に、`link.txt`というリンクを作成します。
```zsh
ln -s faisofhasghafeafafdsa.txt link.txt
```

`cat`コマンドを実行し中身を見ると以下のようなファイルになり、`faisofhasghafeafafdsa.txt`が参照されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/3b90cbc5-34d8-9ef5-195b-8ac3628a3711.png)

`ls -l`を実行すると以下のように出力され、リンクが作成されていることがわかります。
```
faisofhasghafeafafdsa.txt
link.txt -> faisofhasghafeafafdsa.txt
```

### 削除方法
削除は`unlink`で削除できます。
```zsh:相対パス
cd ~/work/link/
unlink link.txt
```

```zsh:絶対パス
unlink ~/work/link/link.txt
```

### シンボリックリンクの作成場所
シンボリックリンクを作成すると、対象のファイルと同階層にリンクが作成される。
```zsh
cd ~/work/link
ln -s faisofhasghafeafafdsa.txt link.txt
```

上記のように作成した場合、`faisofhasghafeafafdsa.txt`と`link.txt`は同じフォルダ内(`~/work/link`フォルダ)にある扱いとなる。

```
work/link
  ┝ a/faisofhasghafeafafdsa.txt
  └ dir
```

もし上記のようなフォルダ構成の場合、dirにリンクを作成することもできる
```zsh
ln -s ~/work/link/a/faisofhasghafeafafdsa.txt dir/link.txt
```
:::note warn
別フォルダにリンクを作成する場合、参照するファイルは絶対パスにしておかないと参照できませんでした。
- ~/work/link/a/faisofhasghafeafafdsa.txtはOK
- a/faisofhasghafeafafdsa.txtはNG
(理由はわかってないです)
:::