我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)
2条答案
按热度按时间nxagd54h1#
您可能在类路径上有多个不同版本的
jsoup
库,并且它们彼此冲突-当您使用Gradle时,它可以正常工作(可能是巧合),但当您尝试将其作为Kotlin脚本时,另一个(非常旧的)版本的库会获得优先级,并且它会崩溃。这将是一个有趣的巧合,但我发现有一段时间
Elements#select
方法被称为filter
:我建议您检查项目的依赖关系树-我不使用Gradle,但似乎
gradlew app:dependencies --scan
应该可以完成这项工作:https://wajahatkarim.com/2020/03/gradle-dependency-tree/如果您多次在输出中看到jsoup库,请检查引入了哪些版本,以及这是否会导致冲突。
iyzzxitl2#
该问题很可能与KotlinMain Kts模块从1.6.0版开始嵌入了几个库(的一部分)有关。您可以看到大小上的差异,例如:
https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-main-kts/1.5.32
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。