Gradle项目:java.lang.NoClassDefFoundError:kotlin / jvm / internal / Intrinsics
问题内容:
我正在做一个Java项目,在这个项目中,我第一次尝试使用Kotlin。我开始使用Intellij
Idea中提供的JavaToKoltin转换器将某些类转换为Kotlin。除其他外,我的自定义例外现在已转换为Kotlin。但是使用此异常处理不再正确。
如果我MyCustomKotlinException.kt
在Java代码中抛出了一个自定义异常(例如),则不会捕获该异常(请参见下面的代码)。
// 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 ...
}
}
}
因此任何人都可以向我解释为什么没有捕获到异常。MyCustomKotlinException
是从Kotlins继承的,Kotlins
RuntimeException
只是java.lang.RuntimeException
。
// MyCustomKotlinException.kt
package foo
class MyCustomKotlinException(err: String) : RuntimeException(err)
更新:
我将throw部分分为两行(实例创建和throwing),发现问题不在于throwing。创建实例后将保留try块。我创建此Kotlin类的实例有什么问题吗?
Update2:
我添加了第二个catch块,Throwable
并捕获了以下Throwable。
java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
Update3:
更改了标题以更正错误,并通过将所有项目文件添加到jar中解决了问题(请参见下面的答案)。将Kotlin运行时库添加到gradle对我不起作用。
问题答案:
将所有项目文件添加到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
根据本下面的答案。