jvm Kotlin脚本中出现java.lang.NoSuchMethodError错误

j9per5c4  于 2022-11-07  发布在  Kotlin
关注(0)|答案(2)|浏览(418)

我skrape.it在Kotlin(Github Repository Link)中使用www.example.com编写了一小段代码。我在一个标准的Gradle项目中编写了它,它运行得非常好。

fun main() {
    val result = skrape(HttpFetcher) {
        request {
            this.url = "http://example.com/"
        }

        response {
            document.a {
                findFirst {
                    eachLink
                }
            }
        }
    }

    println(result)
}

输出为:{More information...=https://www.iana.org/domains/example}
然而,当我尝试以Kotlin脚本的形式运行代码时,它不再工作了。文件名为test.main.kts,我使用kotlin test.main.kts运行它:

@file:DependsOn("it.skrape:skrapeit:1.2.1")

import it.skrape.core.document
import it.skrape.fetcher.HttpFetcher
import it.skrape.fetcher.response
import it.skrape.fetcher.skrape
import it.skrape.selects.html5.a

val result = skrape(HttpFetcher) {
    request {
        this.url = "http://example.com/"
    }

    response {
        document.a {
            findFirst {
                eachLink
            }
        }
    }
}

println(result)

我得到以下异常:

java.lang.NoSuchMethodError: 'org.jsoup.select.Elements org.jsoup.select.Elements.select(java.lang.String)'
    at it.skrape.selects.DomTreeElement.applySelector$html_parser(DomTreeElement.kt:90)
    at it.skrape.selects.CssSelector.applySelector$html_parser(CssSelector.kt:22)
    at it.skrape.selects.CssSelectable.findAll(CssSelectable.kt:36)
    at it.skrape.selects.CssSelectable.findByIndex(CssSelectable.kt:39)
    at it.skrape.selects.CssSelectable.findFirst(CssSelectable.kt:58)
    at it.skrape.selects.CssSelectable.findFirst(CssSelectable.kt:101)
    at it.skrape.selects.CssSelectable.findFirst$default(CssSelectable.kt:100)....

怎么可能呢?它不应该运行相同的吗?这是一个非常小的例子。
kotlin -version给出以下输出:Kotlin version 1.6.21-release-334 (JRE 11.0.13+8-LTS)

nxagd54h

nxagd54h1#

您可能在类路径上有多个不同版本的jsoup库,并且它们彼此冲突-当您使用Gradle时,它可以正常工作(可能是巧合),但当您尝试将其作为Kotlin脚本时,另一个(非常旧的)版本的库会获得优先级,并且它会崩溃。
这将是一个有趣的巧合,但我发现有一段时间Elements#select方法被称为filter

我建议您检查项目的依赖关系树-我不使用Gradle,但似乎gradlew app:dependencies --scan应该可以完成这项工作:https://wajahatkarim.com/2020/03/gradle-dependency-tree/
如果您多次在输出中看到jsoup库,请检查引入了哪些版本,以及这是否会导致冲突。

iyzzxitl

iyzzxitl2#

该问题很可能与KotlinMain Kts模块从1.6.0版开始嵌入了几个库(的一部分)有关。您可以看到大小上的差异,例如:

  • 1.5.32版本:1.6 MB

https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-main-kts/1.5.32

  • 1.6.0版本:6.4 MB

https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-main-kts/1.6.0
我不明白为什么这些外部库没有被着色/重新定位。
实际上,其中一些已重新定位到org.jetbrains.kotlin下:

但不幸的是,不是JSoup和SLF 4J-正是我在我的应用程序中使用的2个库...
请参阅https://youtrack.jetbrains.com/issue/KT-50378上报告的相关问题。

  • 编辑 *

我刚刚在JetBrains打开了一个错误报告:https://youtrack.jetbrains.com/issue/KT-53283

相关问题