gradle - 使用Kotlin和Gradle创建胖子-编译还是实现?

标签 gradle kotlin

我正在用Kotlin&Gradle的一个简单的“hello world”项目进行修补(见下文)。我添加了“fat jar”集合,以引入Kotlin依赖关系,但是当我尝试运行java -jar build/libs/hello-1.0-SNAPSHOT.jar时,由于在运行时无法使用这些依赖关系,因此出现了java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics错误。

我已经通过将implementation更改为compile来解决了这个问题,这使得一切正常。但是据我了解,我们不应该再使用compile,而且apiimplementation都不会使“胖子”收集过程正常工作,并且当我查看dependencies的其他选项时,我不确定该使用哪个。

问题:在这种情况下要做的“正确”事情是什么?

// build.gradle
plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.41'
}

group 'com.example.test'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    // if I change "implementation" to "compile", running the jar works
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

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

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
// Application.kt
fun main(args: Array<String>) {
    println("hello world")
}

最佳答案

不推荐使用compile依赖项。您应该使用implementation声明您的实现依赖关系,并使用compileClasspath来获取所有编译依赖关系。

关于gradle - 使用Kotlin和Gradle创建胖子-编译还是实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57232399/

相关文章:

android - Android布局文件夹可以包含子文件夹吗?

java - Android Studio 上 Kotlin(非 Android)项目的 ClassNotFoundException 错误

spring - Spring Boot Rest API:如何同时支持json和表单编码请求?

gradle - 有没有办法从 gradle 任务中读取命令行参数?

gradle - "gradle publish"错误报告最新

gradle - 如何从 gradle 触发 Artifactory 构建保留

android-studio - Gradle 不 build

java - 使用逐帧动画制作transitionX动画会导致滞后

java - Dagger不生成子组件创建方法

oop - 为什么在 Kotlin 中 Stack<Int> 可以 push(null) 而 ArrayList<Int> 不能 add(null)?