LoginSignup
7
3

More than 3 years have passed since last update.

kotlinでコマンドラインからハローワールドしようとしたら「マニフェストが云々」って怒られた話

Last updated at Posted at 2019-06-27

怒られ方

  • 公式チュートリアルの中から、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ファイルにまとめないとメタファイル等が鬱陶しかったりはします。

7
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3