Java, Scala, playframework install

2023/08/13に公開

もう8年くらいJavaから離れていたのですが、最近知ったサービスがScalaで作られていると聞いて、最近のJavaWebAppのつくりかたを知りたいと思いScala+Playframeworkでサンプルアプリを作って動かしていきたいと思います。

Java install 1.8? 18?

いきなり罠がありました。 どのバージョンのJavaをInstallすればよいかです。
ScalaのページをみるとInstall要件に下記の記述があります

自身のマシンに JDK1.8 (もしくはそれ以降)をインストールしておく必要があります。

OpenJDK 18をインストールしていました。1.8 ではないがすくなくともそれ以降だから問題ないだろうとたかをくくっていました。

(base)  % java --version
openjdk 18.0.1.1 2022-04-22
OpenJDK Runtime Environment (build 18.0.1.1+2-6)
OpenJDK 64-Bit Server VM (build 18.0.1.1+2-6, mixed mode, sharing)

ですが このあとのステップで、playframeworkをいれて いざトップページにアクセスすると、下記のエラーがでてうまく表示されません。

! @82gj16ol4 - Internal server error, for (GET) [/] ->
 
play.api.UnexpectedException: Unexpected exception[UncheckedExecutionException: java.lang.IllegalStateException: Unable to load cache item]
        at play.core.server.DevServerStart$$anon$1.reload(DevServerStart.scala:254)
        at play.core.server.DevServerStart$$anon$1.get(DevServerStart.scala:148)

playframeworkの要件をよくよく見てみると下記の記述があります。

Java versions SE 8 through SE 11, inclusive

新しければよいわけじゃないんですね。。

java SE の履歴, LTS

https://ja.wikipedia.org/wiki/Javaバージョン履歴

Wikipageを参考にするとどうやら JavaSE8 , JavaSE12 で互換性がなくなる大きな変更がはいっているようです。 2018年から結構時間たってますがJavaSE11はLTSでベンダーによりますが2024 から 2027 ごろまではサポートされるようです。Angularとかもそうですが2018年以降突然バージョンが上がるスピードが早くなるので感覚がバグります。

Java SE 7 (2011年7月28日)「Dolphin」
Java SE 8 (2014年3月18日) LTS
Java SE 9 (2017年9月21日)
Java SE 10 (2018年3月20日)
Java SE 11 (2018年9月25日) LTS
Java SE 12 (2019年3月19日)
Java SE 13(2019年9月17日)
Java SE 14(2020年3月17日)
Java SE 15(2020年9月15日)
Java SE 16 (2021年3月16日)
Java SE 17 (2021年9月14日) LTS
Java SE 18 (2022年3月22日)
Java SE 19 (2022年9月20日)
Java SE 20 (2023年3月21日)

Java 11 を追加インストールして切り替える

% brew install openjdk@11
...
% sudo ln -sfn /opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk
# install されているVersionの確認
% /usr/libexec/java_home -V                        
Matching Java Virtual Machines (2):
    18.0.1.1 (arm64) "Oracle Corporation" - "OpenJDK 18.0.1.1" /Library/Java/JavaVirtualMachines/jdk-18.0.1.1.jdk/Contents/Home
    11.0.20 (arm64) "Homebrew" - "OpenJDK 11.0.20" /opt/homebrew/Cellar/openjdk@11/11.0.20/libexec/openjdk.jdk/Contents/Home
% export JAVA_HOME=`/usr/libexec/java_home -v "11"`
% PATH=${JAVA_HOME}/bin:${PATH}
% java --version                                   
openjdk 11.0.20 2023-07-18
OpenJDK Runtime Environment Homebrew (build 11.0.20+0)
OpenJDK 64-Bit Server VM Homebrew (build 11.0.20+0, mixed mode)

openjdk 18 に戻したいときは下記のコマンドです。

% export JAVA_HOME=`/usr/libexec/java_home -v "18"`
% PATH=${JAVA_HOME}/bin:${PATH}

scala sbt install

sdkman というものをインストールしてから、そのツールを使いsbt(Scala Build Tool) をインストールします
https://www.scala-sbt.org/download.html

 %  curl -s "https://get.sdkman.io" | bash 
 % source "$HOME/.sdkman/bin/sdkman-init.sh"
 % sdk version                                 # パスが通っているかの確認
SDKMAN!
script: 5.18.2
native: 0.3.3

% sdk install sbt
Downloading: sbt 1.9.3
In progress...
######################################################################################################################## 100.0%
Installing: sbt 1.9.3
Done installing!
Setting sbt 1.9.3 as default.

その後 sbt console と実行するとscala が実行できます

% sbt console
scala> println("Hello, scala World!")
Hello, scala World!

scala> "\ud842\udf9f"
res2: String = 𠮟

scala> 1.00000000000000000001 == 1
res3: Boolean = true

参考:
https://scala-text.github.io/scala_text/basic.html

playframework install

ここもちょっとした罠があります。
日本語でググると上位に出てくる下記のページは2.4 までしか表示されず、古いです。
https://www.playframework.com/documentation/ja/2.4.x/Installing

typesafe activator を使えとかかれていますが、リンク先にいってもすでにactivatorがありません。
どうやら2.6のときにactivaterはdepecateされて sbt new だけで同等のことができるようになったようです。
https://nag-9-s.gitbook.io/scala-play-notes/activator-deprecated

(base) 00_Scala % sbt new

Welcome to sbt new!
Here are some templates to get started:
 a) scala/toolkit.local               - Scala Toolkit (beta) by Scala Center and VirtusLab
 b) typelevel/toolkit.local           - Toolkit to start building Typelevel apps
 c) sbt/cross-platform.local          - A cross-JVM/JS/Native project
 d) scala/scala-seed.g8               - Scala 2 seed template
 e) playframework/play-scala-seed.g8  - A Play project in Scala
 f) playframework/play-java-seed.g8   - A Play project in Java
 g) softwaremill/tapir.g8             - A tapir project using Netty
 i) scala-js/vite.g8                  - A Scala.JS + Vite project
 m) holdenk/sparkProjectTemplate.g8   - A Scala Spark project
 n) spotify/scio.g8                   - A Scio project
 o) disneystreaming/smithy4s.g8       - A Smithy4s project
 q) quit
Select a template: e
# しばらくまつと、 project 名、org, versionを指定するプロンプトが表示される

そのご 作成されたDirectoryに移動して sbt run と実行します。

% sbt run                                          
[info] welcome to sbt 1.7.2 (Homebrew Java 11.0.20)
[info] loading settings for project play-scala-seed-build from plugins.sbt ...
[info] loading project definition from /Users/takehararyuuji/Desktop/00_Scala/play-scala-seed/project
[info] loading settings for project root from build.sbt ...
[info]   __              __
[info]   \ \     ____   / /____ _ __  __
[info]    \ \   / __ \ / // __ `// / / /
[info]    / /  / /_/ // // /_/ // /_/ /
[info]   /_/  / .___//_/ \__,_/ \__, /
[info]       /_/               /____/
[info] 
[info] Version 2.8.20 running Java 11.0.20
[info] 
[info] Play is run entirely by the community. Please consider contributing and/or donating:
[info] https://www.playframework.com/sponsors
[info] 

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Enter to stop and go back to the console...)
  • ローカルホストで play framework のwebapp が起動しています。 http://localhost:9000/

  • 注意: 下記のようなエラーが表示された場合はjavaのバージョンが合っていない可能性が高いので、上のセクションを参考にjava11 を追加インストールして、切り替えてから実行する。(設定したShellで実行しないと意図通りのバージョン担っていないことがあるので注意)

Discussion