【问题标题】:Can't run generated JAR file with Gradle and Kotlin无法使用 Gradle 和 Kotlin 运行生成的 JAR 文件
【发布时间】:2018-01-22 11:11:23
【问题描述】:

我有一个使用 Gradle 和 Kotlin 配置的项目。这是一个命令行实用程序,我希望能够从我的终端运行生成的 jar。但是我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
    at com.autentia.impt.MainKt.main(Main.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

我的gradle配置如下:

buildscript {
    ext.kotlin_version = '1.2.20'
    ext.junit_platform_version = '1.0.1'
    ext.junit_version = '5.0.0'
    ext.moshi_version = '1.5.0'
    ext.jna_version = '4.5.0'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.junit.platform:junit-platform-gradle-plugin:$junit_platform_version"
    }
}

version '1.0-SNAPSHOT'

apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'org.junit.platform.gradle.plugin'

mainClassName = 'com.autentia.impt.MainKt'

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib"
    implementation "org.jetbrains.kotlin:kotlin-reflect"
    implementation "com.squareup.moshi:moshi:$moshi_version"
    implementation "com.squareup.moshi:moshi-kotlin:$moshi_version"
    implementation "net.java.dev.jna:jna:$jna_version"
    testImplementation("org.junit.jupiter:junit-jupiter-api:$junit_version")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:$junit_version")
}

sourceSets {
    main.kotlin.srcDirs += 'src/main/kotlin'
}

task wrapper(type: Wrapper) {
    gradleVersion = '4.4.1'
}

jar {
    manifest {
        attributes "Main-Class": mainClassName
    }

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

我用来生成jar的命令是./gradlew clean build,我用来运行jar的命令是java -jar build/libs/impt-1.0-SNAPSHOT.jar

我尝试过关注official docs,也尝试过使用这些资源:123,但没有任何运气。

【问题讨论】:

  • 看来您对类路径没有某些依赖关系。您是否有可能在 IDE 的路径上存在这些依赖关系,而不是在您的机器本身的路径上?
  • 同样的问题!你搞清楚了吗?

标签: java gradle jar kotlin


【解决方案1】:

只需将implementation 配置更改为compile。 (至少对于 kotlin-stdlib)

compile 配置已弃用,应在 Android 的 Gradle 插件中替换为 implementationapi,但是对于 kotlin-gradle-plugin,我认为您仍然需要编译。 p>

【讨论】:

    【解决方案2】:

    好吧,我遇到了同样的问题,终于解决了这个问题:

    我的主类名是Main.kt,当我遇到同样的错误时,这是​​我在build.gradle 文件中的名称:

    jar {
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
        manifest {
            attributes(
                    'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
                    'Main-Class': "play.Main"
            )
        }
    }
    

    虽然我注意到当我在 Intellij 中创建 jar 工件时,它使用 play.MainKt 作为我的 Main-Class 名称(是的,奇怪的命名约定),然后我将我的 build.gradle 文件更改为:

    jar {
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
        manifest {
            attributes(
                    'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
                    'Main-Class': "play.MainKt"
            )
        }
    }
    

    现在我没有收到该错误。

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 2021-09-16
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2014-08-16
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多