当前位置: 首页 > 面试题库 >

Gradle项目:java.lang.NoClassDefFoundError:kotlin / jvm / internal / Intrinsics

姜烨伟
2023-03-14
问题内容

我正在做一个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.collectconfigurations.compileClasspath.collect根据本下面的答案。



 类似资料:
  • 我正在做一个Java项目,在这个项目中,我第一次尝试了Kotlin。我开始使用Intellij Idea中提供的JavaToKoltin转换器将一些类转换为Kotlin。除此之外,我的自定义异常现在已转换为Kotlin。但是,在这种情况下,异常处理不再正常工作 如果我在java代码中抛出一个自定义异常(例如,),则不会捕获该异常(请参见下面的代码)。 谁能给我解释一下为什么异常没有被捕获。是从Ko

  • JVM 选项可以通过设置环境变量来更改. 您可以使用 GRADLE_OPTS 或者 JAVA_OPTS. JAVA_OPTS 是一个用于 JAVA 应用的环境变量. 一个典型的用例是在 JAVA_OPTS 里设置HTTP代理服务器(proxy), GRADLE_OPTS 是内存选项. 这些变量可以在 gradle 的一开始就设置或者通过 gradlew 脚本来设置.

  • 我无法在Intellij Ultimate中同步我的新Android Gradle项目。 在“工具”下

  • 主要内容:多项目构建的结构,指定常规构建配置,项目指定配置和依赖关系,Gradle多项目构建的示例,子项目配置,参考可以轻松处理各种大小规模的项目。小项目由一个单一的构建文件和一个源代码树构成。 大项目可以将其拆分成更小的,相互依赖的模块,以便更容易理解。Gradle完美支持这种多项目构建的场景。 多项目构建的结构 这种构建有各种形状和大小,但它们都有一些共同的特点 - 在项目的根目录或主目录中都有一个文件。 根目录或主目录都有一个文件。 具有自己的构建文件的子目录(某些多项目构建可能会省略子项

  • 主要内容:Groovy插件,Groovy项目的默认项目布局本章介绍如何使用文件编译和执行Groovy项目。 Groovy插件 Gradle的Groovy插件扩展了Java插件,并为Groovy程序提供了任务。可以使用以下行来应用groovy插件。 完整的构建脚本文件如下。将以下代码复制到文件中。 可以使用以下命令来执行构建脚本。 Groovy项目的默认项目布局 Groovy插件假定Groovy项目有手动做过一定的设置。 包含Groovy源代码; 包含Gr

  • 主要内容:Java默认的项目布局,初始化任务执行,指定Java版本本章介绍如何使用Gradle构建文件来构建一个Java项目。 首先,我们必须向构建脚本中添加Java插件,因为它提供了编译Java源代码,运行单元测试,创建Javadoc和创建JAR文件的任务。 在文件中使用以下代码行。 怎么样,是不是很简单? Java默认的项目布局 每当添加一个插件到构建中,它会假设一个特定的Java项目设置(类似于Maven)。看看下面的目录结构。 目录包含Java源代码;