今回はWSLを使ってインストールしたUbuntuにKotlinとJavaをインストールし、ターミナルから使ってみようと思います。
まだWSLやUbuntuをインストールしていないという方は、こちらを参考にインストールしてみてください。
SDKMANをUbuntuにインストールする
まずはSDKMANをインストールします。SDKMANはJVM言語のパッケージマネージャーといえば分かりやすいかもしれません。JavaやKotlinのほか、ScalaやGroovyなどJVMで動く言語などをインストール、管理するプロダクトです。
前提としてzipをインストール
その前に、まだzipがインストールされていないという方は
sudo apt install zip
でzipファイルをUbuntuで扱えるようにしておきましょう。SDKMANに限らず色々な場面で使用します。
SDKMANインストールコマンド
curl -s https://get.sdkman.io | bash
これでSDKMANがインストールされます。
最後にEnjoy!!!が出れば完了です。ここでターミナルを再起動しましょう。
パスを通す
このままでは「sdk 〇〇」といったコマンドが通らないので、SDKMANのパスを通します。ユーザー名の部分は適切な文字に入れ替えてください。
source "/home/ユーザー名/.sdkman/bin/sdkman-init.sh"
この後に何も表示されなければ大丈夫。試しにsdkコマンドでヘルプを表示してみます。
sdk help
このようにコマンドのヘルプが出てくれば正しく設定されています。これでSDKMANのインストールと設定は完了です。
KotlinとJavaをインストール
続いてKotlinとJavaをSDKコマンドを使用してインストールしていきます。
sdk install kotlin
sdk install java
Javaの方は若干時間がかかりますが、これだけでKotlinとJavaがインストールできます。
Kotlinのソースファイルをコンパイル
ではコードの実行準備です。Kotlinファイルを作成し、コンパイルしていきましょう。
例として前回までにIntelliJ IDEAで作ったStart.ktファイルをコンパイルします。エディタはお使いのものがあれば何でもかまいません。大きな違いは無いです。
ちなみにファイルの内容はこんな感じ。正しいコードで何らかの出力があればどんなコードでも問題ありません。
このエディタ画面の左側にはプロジェクトツリー画面があると思います。表示されてない方は画面左端の「プロジェクト」をクリックして表示させてください。
ここの1番上のフォルダ(ここではstartフォルダ)をクリックして展開します。
出てきたsrcフォルダを右クリック→「ターミナルで開く」を選択します。
すると画面下側にsrcフォルダをカレントディレクトリとしてターミナルが起動します。
WSLが起動せずにコマンドプロンプトが起動する方は
IntelliJの設定によって起動するターミナルに違いがあります。WSLを使いたいのにコマンドプロンプトが起動してしまうという方はこちらを確認してみましょう。
IntelliJのメニューから「ファイル」→「設定」で設定画面に入ります。
設定画面のメニューにある「ツール」→「ターミナル」と辿ると、画像のような画面になります。
ここの「シェル・パス」を確認して、WSLでなければ変更してください。ちなみに僕の環境では、
C:\Windows\System32\wsl.exeにありました。
コンパイル
WSLが起動すれば、次にコンパイルのコマンドを打ち込んでいきます。
kotlinc Start.kt
Kotlinコンパイラでファイルをコンパイルするコマンドです。Start.ktの部分はファイル名なので、コンパイルするファイルに合わせて変更してください。
コンパイルが成功すれば、プロジェクトツリーのsrcフォルダ内に新たなフォルダとファイルが追加されるはずです。時間が経っても表示されない場合、一度プロジェクトツリー内のどこかをクリックしてみてください。
Kotlinで実行してみる
新規作成された.classファイルはコンパイル済みのバイナリコードですので、そのままKotlinで実行できます。
もう一度ターミナルの入力画面に移って以下のコマンドを打ち込んでみましょう。
kotlin StartKt
#実行結果: 大きい数
こちらもStartKtの部分は作成された.classファイルに合わせてください。
ターミナルからKotlinを動かし、実行結果が得られました。
このコマンドでは拡張子は不要、そのかわりファイル名がKotlinコンパイラによって書き換えられているので、呼び出し方には注意しましょう。
Javaで実行してみる
KotlinはJavaと100%互換性があります。ということでこのKotlinのコード、最終的にJavaで実行してみたいと思います。
まずはKotlinの.ktファイルをコンパイルしますが、こちらは若干コマンドが変わります。
kotlinc Start.kt -include-runtime -d Start.jar
コマンドの最初の部分は先ほどコンパイルしたコマンドと同じですが、「-include-runtime」や「-d」は何でしょう?
Kotlinランタイムを含める -include-runtimeオプション
このオプションはコンパイル時にKotlinランタイムを含めるという意味になります。Javaと100%の互換性があるとはいえ、このランタイムが無いとKotlinのコードはJavaでは実行できません。
ディレクトリを定める -dオプション
次に続く-dオプションはコンパイルされたファイルを格納するアーカイブファイルとして Start.jarという名前のディレクトリを指定するオプションです。
これらのオプションによって、コンパイルされたファイルがKotlinランタイムと一緒にStart.jarというフォルダに格納されてアウトプットされます。
実行してみるとStart.jarというファイルが作成されます。プロジェクトツリーで確認してみましょう。
jarファイルを指定して実行する
この.jarファイルはアーカイブファイルであり、実際にはKotlinコンパイラによって作成された.classファイルやKotlinランタイムなどが1つにまとめられたファイルです。
それではこの.jarをJavaで実行してみましょう。
java -jar Start.jar
#実行結果: 大きい数
Kotlinで実行したときと同じようにコードは正しく動き、実行結果が表示されました。
おさらい
今回はターミナルでKotlin、Javaを実行するというテーマでお送りしました。おさらいしておきましょう。
- JVM言語を管理するパッケージマネージャーとしてSDKMANがある
- SDKMANのインストール時にはパスを通す必要がある
- Kotlinコンパイルは「kotlinc 〇〇.kt」コマンド
- Kotlinでの実行は「kotlin 作成された.classファイル名」。拡張子は不要
- JavaでKotlinコードを実行するにはKotlinランタイムが必要
- JavaでKotlinコードを実行する場合はランタイムを含めた.jarを作成し、それを実行する
次回はKotlinの定型文、fun main(args: Array<String>) の引数が不要になっているという話、ではその引数はどんな意味だったのかということを掘り下げていこうと思います。