怒られ方
- 公式チュートリアルの中から、Working with the Command Line Compilerを開きます。以下、これに沿って進めます。
- まずはkotlinをインストールしろとのこと。とりあえず私はHomebrewでインストールします。
- 次に以下のファイルを作成します。
hello.kt
fun main(args: Array<String>) {
println("Hello, World!")
}
- コマンドラインで以下を打ち込んでコンパイル。
$ kotlinc hello.kt -include-runtime -d hello.jar
- 以下で実行。
$ java -jar hello.jar
- おめでとう!無事、以下のメッセージが出てきます。
hello.jarにメイン・マニフェスト属性がありません
俺が何かしたのか?
分からない。何もしてないのに壊れた。JavaやKotlinに詳しい方、俺が悪かったら教えてください。
とりあえずエラーを直す
色々弄って雰囲気から推察するに、マニフェストファイル内でエントリポイントを指定する必要があるっぽい。
- jarの中身を見てみる。
$ jar tf hello.jar
kotlinのランタイムを除くと、以下のファイルがリストアップされる。
META-INF/MANIFEST.MF
HelloKt.class
META-INF/main.kotlin_module
ファイル名hello.kt
に応じて、自動でHelloKt
というクラスが生まれる模様。
- マニフェストファイルを取り出す。
$ jar xf hello.jar META-INF/MANIFEST.MF
- 取り出したマニフェストファイルを見てみる。
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: JetBrains Kotlin
エントリポイントはMain-Class
という項目で指定するらしい。どうみても無い。
- マニフェストファイルを更新する。
$ jar uvfe hello.jar HelloKt
マニフェストが更新されました
さっき見つけたHelloKt
クラスを指定。
- 確認する。
$ jar xf hello.jar META-INF/MANIFEST.MF
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: JetBrains Kotlin
Main-Class: HelloKt
無事、Main-Class
が追加された。
- 実行
$ java -jar hello.jar
Hello, World!
オーケイ、kotlin完全理解した。
注
Javaおじさんじゃないので、妥当な方針で直せているかは不明。
もっと単純なやり方
@felis さんからコメントで教わりました。ありがとうございます。
classpathに追加してから実行クラスを指定する方法もあります。
java -cp hello.jar HelloKt
コマンドの流れをまとめ直すとこういうことですね。
$ kotlinc hello.kt -include-runtime -d hello.jar
$ java -cp hello.jar HelloKt
Hello, World!
どう考えてもこっちの方が手っ取り早い。
また、このアドバイスにより気づきを得て、以下でも動くことを発見。
$ kotlinc hello.kt -d hello.jar
$ kotlin -cp hello.jar HelloKt
Hello, World!
もっと言えばこれでも良い。
$ kotlinc hello.kt
$ kotlin HelloKt
Hello, World!
随分シンプルになりました。やはりハローワールドはシンプルでないと。
ただ、jarファイルにまとめないとメタファイル等が鬱陶しかったりはします。