代码之家  ›  专栏  ›  技术社区  ›  César Alberca

无法使用Gradle和Kotlin运行生成的JAR文件

  •  6
  • César Alberca  · 技术社区  · 8 年前

    我有一个配置了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 我也尝试了这些资源: 1 , 2 3 没有任何运气。

    2 回复  |  直到 8 年前
        1
  •  5
  •   Erkut Evirgen    8 年前

    只要换一下 implementation 配置到 compile . (至少适用于kotlin stdlib)

    这个 编写 配置已弃用,应替换为 实施 api 在Android的Gradle插件中 kotlin-gradle-plugin ,我想你还需要 编写 .

        2
  •  -1
  •   Yar    7 年前

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

    我的主课名是 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"
            )
        }
    }
    

    虽然我在创建 jar Intellij中的工件,它使用 play.MainKt 作为我的 Main-Class 名字(是的,奇怪的命名惯例),然后我改变了我的 建筑格拉德尔 文件发送到此:

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

    现在我没有犯这个错误。