【问题标题】:Gradle gets dependency but doesn't use it on buildGradle 获得依赖但不在构建时使用它
【发布时间】:2018-07-11 04:02:46
【问题描述】:

我正在使用 Kotlin/JS 开发一个 Web 应用程序,并且我正在尝试使用 Kotlin 库“com.beust:klaxon:3.0.1”(我已经明确编译了 lib 的依赖项并将它们从lib 以减少版本冲突的可能性,在没有显式编译的情况下不成功):

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    implementation('com.beust:klaxon:3.0.1') {
        exclude group: 'org.jetbrains.kotlin'
    }
}

但我不能使用它:

Gradle 输出:

19:40:45: Executing task 'build'...

:compileJava NO-SOURCE
e: .../School-Web-Project/frontend/src/requests/Abstraction.kt: (3, 8): Unresolved reference: com
e: .../School-Web-Project/frontend/src/requests/Abstraction.kt: (20, 57): Unresolved reference: Klaxon
:compileKotlin2Js FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileKotlin2Js'.
> Compilation error. See log for more details

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
1 actionable task: 1 executed
Compilation error. See log for more details
19:40:48: Task execution finished 'build'.

我不知道错误是什么。我已经运行 gradle clean 和 invlidated 缓存并重新启动。

感谢您的宝贵时间。

完整文件:

build.gradle

version '1.0'

buildscript {
    ext.kotlin_version = '1.2.50'
    ext.web_dir = "${projectDir}/web/"
    repositories {
        jcenter()
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.gradle:build-scan-plugin:1.14"
    }
}

apply plugin: 'kotlin2js'
apply plugin: 'com.gradle.build-scan'

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

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    implementation('com.beust:klaxon:3.0.1') {
        exclude group: 'org.jetbrains.kotlin'
    }
}

clean.doFirst() {
    delete("${web_dir}")
}

build.doLast() {
    // Copy kotlin.js and kotlin-meta.js from jar into web directory
    configurations.compile.each { File file ->
        copy {
            includeEmptyDirs = false

            from zipTree(file.absolutePath)
            into "${web_dir}/lib"
            include { fileTreeElement ->
                def path = fileTreeElement.path
                path.endsWith(".js") && (path.startsWith("META-INF/resources/") || !path.startsWith("META-INF/"))
            }
        }
    }

抽象.kt

package requests

import com.beust.klaxon.Klaxon
import org.w3c.xhr.XMLHttpRequest

object Requestables {
    fun requestWeapons(id: Int, amount: Int)
            = "backend/request_weapons.php?id=$id&amount=$amount"
}

object RawRequestData {
    fun getWeaponsRaw(id: Int, amount: Int, callback: (String) -> Unit, error: (XMLHttpRequest) -> Unit = {}) {
        CommonDataRequest.makeAsyncRequest("GET", Requestables.requestWeapons(id, amount), {
            callback(responseText)
        }, error)
    }
}

object WeaponRawProcessing {
    fun getWeaponDTOs(rawData: String): WeaponRowDTO =  Klaxon().parse(rawData)?: throw NullPointerException("What a Terrible Failure!")
}

object Requests {
    fun getWeapons(id: Int, amount: Int, callback: (WeaponRowDTO) -> Unit, error: (XMLHttpRequest) -> Unit = {}) {
        RawRequestData.getWeaponsRaw(id, amount, {
            callback(WeaponRawProcessing.getWeaponDTOs(it))
        }, error)
    }
}

    // Copy scripts to web directory
    copy {
        into "${web_dir}"
        from ("build/classes/kotlin/main") {
            include "*.js"
        }
    }
}

buildScan {
    termsOfServiceUrl = 'https://gradle.com/terms-of-service'
    termsOfServiceAgree = 'yes'
}

【问题讨论】:

  • 你怎么在implementation配置下指定依赖?那不应该是compile吗?我没有看到你在哪里应用 java-library 插件,我认为这是 apiimplementation 配置存在所必需的。
  • @user31601 compile is now deprecated。虽然api 会让我使用 klaxon 的库,但我想做的是“强制”更新它们,这样我就可以防止版本控制问题。
  • 我相信你提到的关于 compile 被弃用的链接答案过于简单化了。如果您通读实际的 Gradle 文档,您会发现这些较新的配置仅在使用 java-library 插件时适用,而不是单独使用 java 插件。您应该在此处使用哪一组依赖项将取决于可传递应用的插件 kotlin2js - 我不确定它是哪个。
  • > 如果您阅读了实际的 Gradle 文档,您会发现这些较新的配置仅在使用 java-library 插件时适用,而不是单独使用 java 插件。
    可以给我一个源链接吗?
  • 当然,here 是。我之前只是没有提供链接,因为我不知道如何在 cmets 中使用(并且错过了小的“帮助”链接)。

标签: build.gradle kotlin-js


【解决方案1】:

我相信com.beust:klaxon 应该与kotlin-jvm 一起使用。对于kotlin-js,你应该使用专门为js构建的库,比如kotlin-stdlib-js

【讨论】:

  • 这没什么用,为什么不起作用?不像是用不同的语言写的,是不是有兼容的方法?
  • 但是它是为不同的平台编译的,它在一个jar中包含jvm的.class文件。为了使其兼容,作者应使用 kotlin2js 编译器对其进行编译。我将尝试查找相关文档来澄清这一点并更新我的答案。
【解决方案2】:

查看source code for the Kotlin Gradle plugins,似乎他们只是传递地应用了java 插件,而不是java-library 插件。这意味着源集的编译类路径将不包括implementation 配置(或api 配置)。

我认为要解决这个问题,您可以:

  1. apply plugin 'java-library' 在你的 build.gradle 中
  2. 将您的依赖项更改为 compile "<coordinates>",以便将它们添加到 compile 配置中。

我还没有测试过,所以如果它有效,请告诉我。

【讨论】:

  • 这两种解决方案似乎都不起作用,也同时尝试了两种方法,也没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2019-08-24
  • 1970-01-01
  • 2016-11-23
相关资源
最近更新 更多