当前位置: 首页 > 知识库问答 >
问题:

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

董高畅
2023-03-14

我正在做一个Java项目,在这个项目中,我第一次尝试了Kotlin。我开始使用Intellij Idea中提供的JavaToKoltin转换器将一些类转换为Kotlin。除此之外,我的自定义异常现在已转换为Kotlin。但是,在这种情况下,异常处理不再正常工作
如果我在java代码中抛出一个自定义异常(例如,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 ...
        }
    }
}

谁能给我解释一下为什么异常没有被捕获。MyCustomKotlinExc0019是从KotlinRuntimeExc0019继承而来的,这只是java.lang.RuntimeExc0019的别名。

// MyCustomKotlinException.kt
package foo

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

更新:
我将抛出部分分成两行(实例创建和抛出),发现问题不在于抛出。try块在实例创建后保留。我创建这个Kotlin类的实例有什么问题吗?

更新2:
我用Throwable添加了第二个catch块,并捕获了以下Throwable。

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

更新3:
将标题更改为更正错误,并修复了将所有项目文件添加到jar的问题(见下面的答案)。将静态编程语言运行库添加到gradle不适合我。

共有3个答案

阎单鹗
2023-03-14

此错误可能是由于简单jar任务没有接受其所有运行时依赖项。

从gradle留档中,在你的build.gradle.kts中,你可以创建一个"FatJar"任务,也可以将其添加到jar任务中:

tasks.withType<Jar> {
    // Otherwise you'll get a "No main manifest attribute" error
    manifest {
        attributes["Main-Class"] = "com.example.MainKt"
    }

    // To add all of the dependencies
    from(sourceSets.main.get().output)

    dependsOn(configurations.runtimeClasspath)
    from({
        configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
    })
}
公孙英飙
2023-03-14

你需要用kotlin配置你的项目。所以在Android Studio中:

>

  • 点击工具=

    然后在对话框中检查:包含kotlin文件的所有模块

    然后选择版本

    按ok

    完成。

  • 左丘峰
    2023-03-14

    将所有项目文件添加到jar解决了这个问题。我在构建中添加了以下行。格雷德尔

    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) } }
    }
    

    更新:更改了配置。编写收集配置。编译路径。根据下面的答案收集

     类似资料:
    • 问题内容: 我正在做一个Java项目,在这个项目中,我第一次尝试使用Kotlin。我开始使用Intellij Idea中提供的JavaToKoltin转换器将某些类转换为Kotlin。除其他外,我的自定义例外现在已转换为Kotlin。但是使用此异常处理不再正确。 如果我在Java代码中抛出了一个自定义异常(例如),则不会捕获该异常(请参见下面的代码)。 因此任何人都可以向我解释为什么没有捕获到异常

    • Java服务端的Web组件(JavaEE)提供动态扩展能力允许你在web容器或者应用服务器中运行你的程序,就像Servlet这个名字的意思,接收客户端的请求返回响应,在MVC架构中充当控制器的角色,Servlet的响应通过视图组件--JSP来渲染,下图展示了一个典型的MVC架构的Java应用。 WAR(web application archive)用来捆绑Web组件、编译生成的class文件以及

    • im使用的是Liferay7.1,当我想部署SpringMvcPortlet时,我遇到了以下错误: 无法解析配置“:Wars:MySpringMVCPortlet:CompileClasspath”的所有文件。 找不到javax。validation:validation-api:。要求方:project:Wars:SpringMVCPortletFormation找不到org.hibernate

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

    • 问题内容: 在Gradle多项目设置中是否无法在主项目文件夹之外使用外部依赖项? 就像文件中一样 还是必须 始终 将相关项目包含在父项目文件夹中? 问题答案: 假设以下文件系统层次结构: 将以下内容添加到您的中: 和你内心里面的 根据需要重复尽可能多的项目。

    • 我有一个Spring Boot项目,作为一个可执行jar运行,在Linux上作为init.d服务启动。 我知道我可以创建一个与jar文件同名的。conf文件来指定JVM参数。但是,理想情况下,我希望“硬编码”一些参数,这样就不会有.conf文件丢失的风险。这是一个真正的风险,因为每个部署都将因版本号而具有不同的jar名称。 或者,是否有一种方法来硬编码静态CONF文件名?查看embeddedLau