kts編
https://matsudamper.hatenablog.com/entry/2021/11/27/070504
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/