【Kotlin】Kotlin CLIでKotlinをJavaバイトコードにコンパイル/実行する
今日はじめてKotlinを触ってみたのですが、その際に使用したKotlin CLIによるコンパイルと実行のメモです。
Kotlin CLIのインストール
実施環境:Mac OS X Mojave 10. 14.2
brew でインストールできます。
$ brew update $ brew install kotlin
コンパイル
適当な .kt
ファイルを用意します。
hoge.kt
fun main(args: Array<String>) {
println(args)
}
kotlinc
コマンドでコンパイルします(オプションでKotlinランタイムを含めたjarを生成)。
$ kotlinc hoge.kt -include-runtime -d hoge.jar
jar
ファイルが生成されるので、Java同様 java
コマンドで実行します。
$ ls hoge.kt hoge.jar $ java -jar hoge.jar [Ljava.lang.String;@1b6d3586
コンパイル時に -include-runtime
でKotlinランタイムを含めているのは、Kotlinコンパイラでコンパイルされて生成されたバイトコードがKotlinランタイムのライブラリに依存しているためです。ランタイムを含めずにそのままコンパイルすると、実行時に kotlin/jvm/internal/Intrinsics
クラスが見つからず ClassNotFoundException
例外を送出します。
$ kotlinc hoge.kt $ kotlinc _hoge.class Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at _hoge.main(1_5_1_compile.kt) Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more
ちなみに kotlinc
コマンドを引数なしで実行すると、インタラクティブシェル(REPL)が起動されます。
$ kotlinc Welcome to Kotlin version 1.3.11 (JRE 1.8.0_131-b11) Type :help for help, :quit for quit >>> println("Hello, Kotlin CLI !") Hello, Kotlin CLI ! >>> :help Available commands: :help show this help :quit exit the interpreter :dump bytecode dump classes to terminal :load <file> load script from specified file