Scalaを少しだけ使う事になった人のための環境構築


これはScalaの環境構築についての投稿です。
以下のような人のために書きました。

- サーバーエンジニアからjarファイルを渡されたクライアントエンジニア[^1]
- gitのリポジトリのURLを渡されて、ソースコードからビルドする事になったインフラエンジニア
- ネット上のサンプルコードを簡単に実行したい人

つまり、詳細な説明よりも、まずはすぐ動かせるようにしたい人に向けての内容です。
30分程度で実行環境を作れると思いますが、Dockerイメージを作ってもらった方が早いかもしれません。


[^1]: この場合Javaのインストールは必要ですがsbtは必要ありません。


# 実行環境準備

はじめにJavaとsbtをインストールして実行環境の用意します。


## Javaのインストール
ScalaはJava上で実行されるので、Javaの実行、開発環境であるJDK(Java SE Development Kit)をインストールします。
Java10が最新バージョンですが、2018/06/20現在はJava8をインストールするのが無難です。

### Mac
以下の投稿を参考にインストールしてください。
https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2


_Note:
Javaは今後のバージョン毎のサポート期間が短くなったり、破壊的な変更が入る可能性が上がってきたので、
実行環境のバージョンを管理するjEnv(Pythonのpyenv相当のツール)を使用するのも選択肢の一つです。
https://qiita.com/uhooi/items/9a6747084bcfd4df07a6
とはいえjEnv自体煩雑ですし、Javaは互換性を重視する文化なので、私は今の所jEnvは使用していません。_


### Windows
以下の投稿を参考にインストールしてください。
https://qiita.com/ko2a/items/69fa8a5366d7449500ca


### Javaのインストールの確認
*java -version* を実行して以下の様にバージョンが表示されれば、インストールは成功です。

```Bash
$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
```


## sbtのインストール

sbtはScala本体のバージョンとライブラリの管理、ビルドの実行などを行うツールです。
sbtはJavaのGradleや、Node.jsのnpmに相当します。
build.gradleやpackage.jsonに相当するbuild.sbtというファイルを使うこともできます。

sbtは0.13.x.x系と1.x.x系があります。
プロジェクト内のbuild.propertiesに記載されているのと同じ系をインストールしてください。
特に指定がない場合は、1.x.x系をインストールしてください。


### Mac
公式サイトに記載の通り、 *brew install* コマンドでインストールできます。
https://www.scala-sbt.org/1.0/docs/ja/Installing-sbt-on-Mac.html

### Windows
公式サイトからインストーラーをダウンロードしてインストールしてください。
https://www.scala-sbt.org/1.0/docs/ja/Installing-sbt-on-Windows.html

### インストールの確認
*sbt sbtVersion* を実行してバージョンが表示されればインストールは成功です。

```Bash
$ sbt sbtVersion
[info] Loading settings from idea.sbt ...
[info] Loading global plugins from /Users/xxxx/.sbt/1.0/plugins
[info] Loading project definition from /xxxx/project
[info] Set current project to xxxx (in build file:/xxxx/)
[info] 1.1.0
```

_Note:
古いドキュメントではActivatorが使用されている例もありますが、Activatorは開発終了してしまったのでsbtを使うようにしてください。
sbtとactivatorのコマンド体系はおよそ同じなので多くの場合、単純に読み換える事ができます。
参考　https://qiita.com/TKR/items/9200ca19e14376b305b5_

# プログラムの実行方法

## パッケージングされたjarを渡された場合
パッケージングされたjarファイルはjavaコマンドで実行します。
以下が実行例ですが、追加でコマンドライン引数などが必要な場合は、jarファイルを作った人が教えてくれます。

```Bash
java -jar xxx.jar
```

## gitのリポジトリのURLを渡されて、ソースコードからビルドする事になった場合

git cloneした後に *sbt run* コマンドでビルドして実行する事ができます。

```Bash
sbt run
```

参考までに、その他の実行コマンドの例も記載しますが、
追加のパラメーターなどが必要な場合は、README.mdなどに記載があるはずです。

```Bash
# 起動時のパラメーターに8080を渡す
sbt "run 8080"

# エントリーポイントが複数ある場合はパッケージとClassを指定して実行する
sbt "runMain foo.bar.bazMain"

# マルチプロジェクトの場合に実行するサブプロジェクトを指定する
sbt "xxxx/run"
# build.sbtに
# lazy val xxxx = (project in file("xxxx"))
# と記述がある場合xxxxがサブプロジェクトです
```


## サンプルコードを簡単に実行したい場合

ScalaにもIntelliJなどでプロジェクトを作らずとも、REPL上でコードを実行する仕組みがあります。

ネット上などで例示されているコードで

```
libraryDependencies += ... 
```
のように外部のライブラリを追加している場合があります。

通常のScalaのREPLではライブラリの追加はやりにくいので、sbtからREPLを起動して、外部ライブラリを簡単に追加できるようにします。

以下はREPにファイル入出力のライブラリを追加する例です。


```Bash
# sbtの起動
$ sbt

# ライブラリの追加
> set libraryDependencies += "com.github.pathikrit" %% "better-files" % "3.5.0"

# REPLの起動
> console

# REPLを使用する
scala> import better.files._
scala> File("/tmp/hello.txt").overwrite("world")

# REPLの終了
scala> :q

# sbtの終了
> exit
```