アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

KotlinをGradleでビルド

gradleでビルドする時に以下のように書けというのが多いですが動かなかったので調べました。

既存コード

jar {
    manifest {
        attributes 'Main-Class': 'net.matsuda.MainKt'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

エラー

Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/TypeCastException
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        at java.lang.Class.getMethod0(Class.java:3018)
        at java.lang.Class.getMethod(Class.java:1784)
        at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)

改善コード

compileをruntimeClasspathに変えたら動きました。何故だ。

from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }

理由?

compile と runtimeがdepricateになってるみたい。 https://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle
https://github.com/gradle/gradle/issues/8585

参考

https://www.reddit.com/r/Kotlin/comments/d4nlnu/gradle_error_supposed_fix_not_working/