我正在尝试构建我的项目,但每次都会出现以下错误:
java.lang.NoSuchMethodError: 'kotlin.sequences.Sequence com.google.devtools.ksp.processing.Resolver.getPackagesWithAnnotation(java.lang.String)'
at androidx.room.compiler.processing.ksp.KspRoundEnv.getElementsAnnotatedWith(KspRoundEnv.kt:107)
at androidx.room.compiler.processing.CommonProcessorDelegate.processRound(XBasicAnnotationProcessor.kt:100)
at androidx.room.compiler.processing.ksp.KspBasicAnnotationProcessor.process(KspBasicAnnotationProcessor.kt:62)
at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension$doAnalysis$6$1.invoke(KotlinSymbolProcessingExtension.kt:291)
at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension$doAnalysis$6$1.invoke(KotlinSymbolProcessingExtension.kt:289)
at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension.handleException(KotlinSymbolProcessingExtension.kt:394)
at com.google.devtools.ksp.AbstractKotlinSymbolProcessingExtension.doAnalysis(KotlinSymbolProcessingExtension.kt:289)
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:123)
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:99)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:257)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:42)
at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:115)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:248)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:88)
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:47)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:167)
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:101)
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:47)
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1645)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) …Run Code Online (Sandbox Code Playgroud) 在这些日子里,我正在尝试编写一些代码来体验Spring 5中的Spring反应特性和kotlin扩展,并且我还准备了一个gradle Kotlin DSL build.gradle.kt来配置gradle构建.
它build.gradle.kt是由http://start.spring.io生成的Spring Boot模板代码转换而来.
但是ext在buildscriptGradle中无法检测到.
buildscript {
ext { }
}
Run Code Online (Sandbox Code Playgroud)
这ext将导致Gradle构建错误.
为了使变量进入classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")并compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion")工作,我以艰难的方式添加了变量.
val kotlinVersion = "1.1.4"
val springBootVersion = "2.0.0.M3"
Run Code Online (Sandbox Code Playgroud)
但我必须在全球顶级位置声明它们并将其复制到buildscript.
代码:https://github.com/hantsy/spring-reactive-sample/blob/master/kotlin-gradle/build.gradle.kts
是否有优雅的ext工作方法?
更新:有一些丑陋的方法:
从Gradle Kotlin DSL示例https://github.com/gradle/kotlin-dsl/tree/master/samples/project-properties中,声明了gradel.properties中的属性.
kotlinVersion = 1.1.4
springBootVersion = 2.0.0.M3
Run Code Online (Sandbox Code Playgroud)
并在build.gradle.kts中使用它.
buildScript{
val kotlinVersion by project
}
val kotlinVersion by project //another declare out of buildscript block.
Run Code Online (Sandbox Code Playgroud)与上面类似,在buildScript块中声明它们:
buildScript{ …Run Code Online (Sandbox Code Playgroud)我正在遵循本指南。
该指南写道:项目的额外属性可以从其子项目中看到。这似乎对我不起作用,因为以下内容不起作用:
在build.gradle.kts我有:
val ktorVersion by extra("1.3.2")
Run Code Online (Sandbox Code Playgroud)
在subproject/build.gradle.kts我有:
dependencies {
implementation("io.ktor:ktor-server-core:$ktorVersion")
}
Run Code Online (Sandbox Code Playgroud) 通过 build.gradle 构建 Kotlin 项目成功:
compileKotlin {
kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8
}
compileTestKotlin {
kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8
}
Run Code Online (Sandbox Code Playgroud)
好的。
但我需要更改为build.gradle.kts:
plugins {
kotlin("jvm") version "1.2.10"
id("application")
}
group = "com.myproject"
version = "1.0-SNAPSHOT"
application {
mainClassName = "MainKt"
}
java.sourceCompatibility = JavaVersion.VERSION_1_8
repositories {
mavenCentral()
jcenter()
}
val kotlinVer = "1.2.10"
dependencies {
compile(kotlin(module = "stdlib-jre8", version = kotlinVer))
implementation("com.google.code.gson:gson:2.7")
implementation("com.squareup.okhttp3:logging-interceptor:3.8.0")
implementation("com.squareup.retrofit2:converter-gson:2.1.0")
implementation("com.squareup.retrofit2:retrofit:2.5.0")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud)
现在我得到错误:
Line …Run Code Online (Sandbox Code Playgroud) 我有一个多项目构建,而且我经常发现自己锁定了所有工件的版本。所以在我的根项目中,我定义了类似的东西:
project.extra.set("pkgVersions", mapOf(
"kotlin" to "1.2.0",
"jooq" to "3.10.2"
))
val pkgVersions : Map<String, String> by project.extra
plugins {
base
kotlin("jvm") version "1.2.0" apply false
}
Run Code Online (Sandbox Code Playgroud)
虽然我可以pkgVersions在任何地方使用,包括其他子项目:
val pkgVersions by rootProject.extra
jooq {
version = pkgVersions["jooq"]
}
Run Code Online (Sandbox Code Playgroud)
我无法在插件块中这样做:
plugins {
kotlin("jvm") version pkgVersions["kotlin"]
}
Run Code Online (Sandbox Code Playgroud)
给我错误“隐式接收器无法在此上下文中调用 pkgVersions。如果需要,请使用显式一个”。我假设这是因为隐式接收器应该是文件的 JVM 印象?但它正在使用PluginDependencySpec. 尝试使用this@仅显示的自动完成this@plugin。这只是我的一个长期猜测。但是,关于我应该做什么的任何指示?
另外,虽然我们是在它,有没有一种方法来创建一个全球型的gradle-kotlin-dsl,例如:
data class MyBuildType(..)
Run Code Online (Sandbox Code Playgroud)
并且在不使用的情况下随处可用buildSrc?它非常简单,buildSrc我不介意使用它,但只是想知道。
为了描述Gradle构建脚本,我们可以使用Kotlin via build.gradle.kts文件.全局定义要使用的 Kotlin版本是常见的问题,无论是dependencies在构建plugin部分还是在构建部分中(对于给定的案例,使用不同的版本是相当罕见的).
请考虑以下代码(Gradle 4.3.1):
plugins {
var pluginVersion = "1.2.30"
kotlin("jvm").version(kotlinVersion)
// more
}
var dependencyVersion = "1.2.30"
dependencies {
compile(kotlin("stdlib", kotlinVersion))
compile(kotlin("reflect", kotlinVersion))
testCompile(kotlin("test", kotlinVersion))
// more
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,kotlin version(在这种情况下为1.2.30)定义了两次:dependencyVersion并且pluginVersion,通常没有区别.由于DSL限制,不可能pluginVersion从plugins块外部访问或dependencyVersion从plugins块内访问.
如何将版本字符串"1.2.30"提取到一个地方?
我开始从build.gradle(Groovy)迁移到build.gradle.kts(Kotlin DSL)。问题是com.google.common.util.concurrent.ListenableFuture(from com.google.guava) 存在于几个依赖项中。由于该构建失败并java.lang.RuntimeException: Duplicate class ...出现错误。
以前(当我build.gradle在 Groovy 中时)这个问题是用这个片段解决的:
configurations {
all*.exclude group: 'com.google.guava', module: 'listenablefuture'
}
Run Code Online (Sandbox Code Playgroud)
但是我使用 Kotlin DSL 找不到任何类似的东西。您能否为上面的代码片段提供 Kotlin 替代方案,或者建议任何其他解决方案来解决这个问题?
我已经发布了 Maven bom 并将其导入到顶级 build.gradle.kts 中,如下所示:
allProjects {
dependencies {
implementation(platform("com.example:some-dependencies:1.2.3"))
}
}
Run Code Online (Sandbox Code Playgroud)
然后在libs.versions.toml:
[libraries]
some-bom = { group = "com.example", name="some-dependencies", version="1.2.3" }
Run Code Online (Sandbox Code Playgroud)
当我将第一个代码示例更改为:
allProjects {
dependencies {
implementation(platform(libs.some.bom))
}
}
Run Code Online (Sandbox Code Playgroud)
我得到:
Could not resolve: javax.xml.bind:jaxb-api
Could not resolve: org.springframework.boot:spring-boot-starter-test
...
Run Code Online (Sandbox Code Playgroud)
有没有办法将 Gradle 7 版本目录与 boms 一起使用?
所以我正在使用 Gradle Kotlin DSL,我想知道是否可以读取里面的 gradle 属性settings.gradle.kts?
我有gradle.properties这样的文件:
nexus_username=something
nexus_password=somepassword
Run Code Online (Sandbox Code Playgroud)
我已经这样做了,但仍然无法读取属性。
dependencyResolutionManagement {
repositories {
mavenCentral()
google()
maven { setUrl("https://developer.huawei.com/repo/") }
maven { setUrl("https://jitpack.io") }
maven {
setUrl("https://some.repository/")
credentials {
val properties =
File(System.getProperty("user.home")+"\\.gradle", "gradle.properties").inputStream().use {
java.util.Properties().apply { load(it) }
}
username = properties["nexus_username"].toString()
password = properties["nexus_password"].toString()
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我的项目有两个不同的build.gradle文件,用groovy语法编写.我想将这个groovy写入的gradle文件更改为用Kotlin语法(build.gradle.kts)编写的gradle文件.
我将向您展示根项目build.gradle文件.
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
//ext.kotlin_version = '1.2-M2'
ext.kotlin_version = '1.1.51'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0-alpha01'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)
我尝试了几种在互联网上找到的"方式",但没有任何效果.重命名文件,显然不是解决方案,没有帮助.我在我的根项目中创建了一个新的build.gradle.kts文件,但该文件没有显示在我的项目中.gradle也没有识别出新文件.
所以我的问题是:如何将我的groovy build.gradle文件转换为kotlin build.gradle.kts并将此新文件添加到我现有的项目中?
谢谢你的帮助.