Gradle プロジェクト: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics 質問する

Gradle プロジェクト: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics 質問する

私は Java プロジェクトに取り組んでおり、このプロジェクト内で初めて Kotlin を試しました。Intellij Idea で提供されている JavaToKoltin コンバーターを使用して、いくつかのクラスを Kotlin に変換し始めました。特に、カスタム例外が Kotlin に変換されました。しかし、これでは例外処理が正しく機能しなくなりました。Javaコード内で
カスタム例外の 1 つ (例MyCustomKotlinException.kt) をスローすると、例外はキャッチされません (以下のコードを参照)。

// Example.java
package foo    

import java.util.*;
import java.lang.*;
import java.io.*;
import foo.MyCustomKotlinException;

class Example
{
    public static void main (String[] args)
    {
        try {
            // Do some stuff
            // if Error
            MyCustomKotlinException e = new MyCustomKotlinException("Error Message");
            throw e;
        } catch (MyCustomKotlinException e) {  // <-- THIS PART IS NEVER REACHED
            // Handle Exception
        } catch (Throwable e) {
            e.printStackTrace(); <-- This is catched
        } finally {
            // Finally ...
        }
    }
}

例外が catch されない理由を誰か説明してもらえますか。MyCustomKotlinExceptionは Kotlins から継承していますRuntimeExceptionが、これは の単なるエイリアスですjava.lang.RuntimeException

// MyCustomKotlinException.kt
package foo

class MyCustomKotlinException(err: String) : RuntimeException(err)

アップデート:
throw 部分を 2 行 (インスタンス作成と throw) に分割したところ、問題は throw ではないことがわかりました。try ブロックはインスタンス作成後に残されています。この Kotlin クラスのインスタンス作成に何か問題がありますか?

アップデート2:
2 番目の catch ブロックを追加しThrowable、次の Throwable がキャッチされます。

java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics

アップデート3:
タイトルを変更してエラーを修正し、すべてのプロジェクト ファイルを jar に追加する際の問題を修正しました (以下の回答を参照)。Kotlin ランタイム ライブラリを gradle に追加しても機能しません。

ベストアンサー1

すべてのプロジェクトファイルをjarに追加することで問題は解決しました。次の行をbuild.gradle

jar {
    manifest {
        attributes ...
    }
    // This line of code recursively collects and copies all of a project's files
    // and adds them to the JAR itself. One can extend this task, to skip certain
    // files or particular types at will
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}

アップデート:configurations.compile.collectに従ってconfigurations.compileClasspath.collect変更これ下記に回答してください。

おすすめ記事