環境構築
DockerでScala環境を作りました。バージョンは気にしていないです。
scriptsディレクトリをマウントしてローカルから編集できるようにしています。
├── Dockerfile
├── docker-compose.yml
└── scripts <空のディレクトリ>
Dockerfile
FROM centos:7
# JVM
RUN yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el7_4.x86_64
ENV PATH $PATH:$JAVA_HOME/bin
ENV CLASSPATH .:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
# Scala
WORKDIR /usr/local/lib
RUN yum -y install wget
RUN wget http://downloads.typesafe.com/scala/2.12.6/scala-2.12.6.tgz
RUN tar zxvf scala-2.12.6.tgz
RUN ln -s scala-2.12.6 scala
ENV SCALA_HOME=/usr/local/lib/scala
ENV PATH $PATH:$SCALA_HOME/bin
# sbt
RUN curl https://bintray.com/sbt/rpm/rpm | tee /etc/yum.repos.d/bintray-sbt-rpm.repo
RUN yum -y install sbt
RUN sbt
RUN mkdir -p /opt/scala
WORKDIR /opt/scala
CMD ["/bin/bash"]
docker-compose.yml
scala_sbt:
container_name: scala_sbt
build: .
volumes:
- ./scripts:/opt/scala
tty: true
コンテナを作成して起動します。結構時間かかります。
docker-compose up -d
起動したコンテナに入ります。
docker-compose exec scala_sbt bash
もしくは
docker exec -it scala_sbt bash
scalaのREPL(対話型インタープリター)が起動できるか試してみます。
scala
と打って、以下のように出ればOKです。
Welcome to Scala 2.12.6 (OpenJDK 64-Bit Server VM, Java 1.8.0_181).
Type in expressions for evaluation. Or try :help.
scala>
Hello Worldプロジェクトの作成
まず、helloworldプロジェクトを作成します。
cd scripts
mkdir helloworld
cd helloworld
build.sbt
を作成します。
build.sbt
name := "hello-world"
version := "1.0"
scalaVersion := "2.12.6"
sbtの標準的なディレクトリ構成の一部を作成します。
├── build.sbt
├── project
│ ├── build.properties
│ └── target
├── src
│ ├── main
│ │ ├── resources
│ │ └── scala
│ └── test
│ ├── resources
│ └── scala
└── target
今回はsrc以下のみ作成します。
mkdir -p src/{main,test}/{resources,scala}
最後にsrc/main/scala/
にHelloWorld.scala
を作成します。
HelloWorld.scala
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
ここまでで、ディレクトリ構成は以下のようになっています。
helloworld
├── build.sbt
└── src
├── main
│ ├── resources
│ └── scala
│ └──HelloWorld.scala
└── test
├── resources
└── scala
実行
sbt run
Hello World!が出ればOKです。初回は少し時間かかります。
詰まった箇所
docker-compose
docker-composeでtty: true
としていないと、コンテナが起動しない。
詳しくはこちら
main関数
args
の部分を省略して、以下のようにしてsbt run
したらエラー。
HelloWorld.scala
object HelloWorld {
def main(): Unit = {
println("Hello World!")
}
}
[error] java.lang.RuntimeException: No main class detected.
[error] at scala.sys.package$.error(package.scala:26)
[error] (Compile / bgRun) No main class detected.
また、Unit
の部分は省略できるようです。