概要および事前準備
Scala は JVM 上で動作するバイトコードにコンパイルできる言語です。JAVA よりも柔軟な記述ができます。事前にこちらからダウンロードおよびインストールしておいてください。以下は Maven を利用する前提での記述になっています。以下のようにしてプロジェクトのテンプレートを生成します。
scala-quickstart-archetype (GitHub)
$ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-scala-app -Dversion=1.0 \
-DarchetypeGroupId=pl.org.miki -DarchetypeArtifactId=scala-quickstart-archetype -DinteractiveMode=false
- artifact: 通常 JAR のことを指します
- group: artifact の集合体です
- archetype: pl.org.miki グループの scala-quickstart-archetype アーティファクトでテンプレートを生成します
Java で実行できる全部入りの jar を生成
scala や scalac コマンドを用いてコンパイルしていってもよいのですが mvn を利用していると成果物 jar を汎用的な手順で生成できます。
src/main/scala/com/mycompany/app/HelloWorld.scala
package com.mycompany.app
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
以下のコマンドで jar を生成します。
$ mvn package
「-cp jarファイルのクラス検索パス」オプションを利用して成果物 jar を実行してみます。
$ jar tf target/my-scala-app-1.0.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/mycompany/
com/mycompany/app/
com/mycompany/app/HelloWorld$.class
com/mycompany/app/HelloWorld.class
META-INF/maven/
META-INF/maven/com.mycompany.app/
META-INF/maven/com.mycompany.app/my-scala-app/
META-INF/maven/com.mycompany.app/my-scala-app/pom.xml
META-INF/maven/com.mycompany.app/my-scala-app/pom.properties
$ scala -cp target/my-scala-app-1.0.jar com.mycompany.app.HelloWorld
Hello, world!
ただしこのままでは java では実行できません。java は scala ライブラリの所在を知らないためです。
$ java -cp target/my-scala-app-1.0.jar com.mycompany.app.HelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: scala/Predef$
at com.mycompany.app.HelloWorld$.main(HelloWorld.scala:5)
at com.mycompany.app.HelloWorld.main(HelloWorld.scala)
...
Apache Maven Assembly Plugin の利用
Maven の Assembly Plugin を利用すると mvn package で生成される jar 内に依存関係がある外部 jar をすべて含めることができます。scala ライブラリが jar に含められるため java でも実行できるようになります。利用方法は簡単です。pom.xml に以下の内容を追記します。
<plugin>
<!-- NOTE: We don't need a groupId specification because the group is
org.apache.maven.plugins ...which is assumed by default.
-->
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.mycompany.app.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
再度 jar を生成して実行してみましょう。
$ mvn package
$ java -jar target/my-scala-app-1.0-jar-with-dependencies.jar
Hello, world!
このうち以下の部分を削除すると -jar オプションで実行はできなくなります。メイン・マニフェスト情報がないためです。
<archive>
<manifest>
<mainClass>com.mycompany.app.HelloWorld</mainClass>
</manifest>
</archive>
実行例
$ mvn package
$ java -jar target/my-scala-app-1.0-jar-with-dependencies.jar
target/my-scala-app-1.0-jar-with-dependencies.jarにメイン・マニフェスト属性がありません
$ java -cp target/my-scala-app-1.0-jar-with-dependencies.jar com.mycompany.app.HelloWorld
Hello, world!
Apache Maven Shade Plugin
Apache Maven Shade Plugin でも Apache Maven Assembly Plugin と同様のことができます。利用方法は簡単です。POM を以下のように書き換えるだけです。
pom.xml
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<!-- put your configurations here -->
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>com.mycompany.app.HelloWorld</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
参考にした公式ページは以下のとおりです。
実行例
$ mvn package
$ java -jar target/my-scala-app-1.0.jar
Hello, world!
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...