标签: gradle-kotlin-dsl

如何解决 Gradle 构建错误:java.lang.NoSuchMethodError

我正在尝试构建我的项目,但每次都会出现以下错误:

错误1
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)

android gradle-kotlin-dsl

28
推荐指数
2
解决办法
7505
查看次数

Gradle Kotlin DSL无法识别buildcript中的ext

在这些日子里,我正在尝试编写一些代码来体验Spring 5中的Spring反应特性和kotlin扩展,并且我还准备了一个gradle Kotlin DSL build.gradle.kt来配置gradle构建.

build.gradle.kt是由http://start.spring.io生成的Spring Boot模板代码转换而来.

但是extbuildscriptGradle中无法检测到.

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工作方法?

更新:有一些丑陋的方法:

  1. 从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)
  2. 与上面类似,在buildScript块中声明它们:

    buildScript{ …
    Run Code Online (Sandbox Code Playgroud)

gradle kotlin build.gradle gradle-kotlin-dsl

26
推荐指数
6
解决办法
8001
查看次数

如何使用 Gradle Kotlin DSL 为所有 Gradle 子项目定义变量

我正在遵循指南。

该指南写道:项目的额外属性可以从其子项目中看到。这似乎对我不起作用,因为以下内容不起作用:

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)

gradle kotlin gradle-kotlin-dsl

24
推荐指数
2
解决办法
2万
查看次数

未解决的参考:build.gradle.kts 中的 compileKotlin

通过 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)

gradle kotlin gradle-kotlin-dsl

23
推荐指数
3
解决办法
1万
查看次数

不能在插件块中使用项目额外的属性

我有一个多项目构建,而且我经常发现自己锁定了所有工件的版本。所以在我的根项目中,我定义了类似的东西:

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-dsl

20
推荐指数
3
解决办法
9090
查看次数

Gradle Kotlin DSL:在独特的地方定义Kotlin版本

为了描述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限制,不可能pluginVersionplugins块外部访问或dependencyVersionplugins块内访问.

如何将版本字符串"1.2.30"提取到一个地方?

gradle kotlin build.gradle gradle-kotlin-dsl

19
推荐指数
3
解决办法
2334
查看次数

如何从 Kotlin DSL build.gradle 中的所有依赖项中排除库?

我开始从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 替代方案,或者建议任何其他解决方案来解决这个问题?

android gradle kotlin gradle-kotlin-dsl kotlin-dsl

19
推荐指数
2
解决办法
6677
查看次数

Gradle 7.0 maven bom 版本目录

我已经发布了 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 build.gradle maven-bom gradle-kotlin-dsl

19
推荐指数
1
解决办法
7560
查看次数

读取 settings.gradle.kts 中的 Gradle 属性

所以我正在使用 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)

android gradle kotlin gradle-kotlin-dsl

19
推荐指数
2
解决办法
1万
查看次数

将现有的groovy build.gradle文件转换为基于kotlin的build.gradle.kts

我的项目有两个不同的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并将此新文件添加到我现有的项目中?

谢谢你的帮助.

groovy kotlin gradle-kotlin-dsl

17
推荐指数
1
解决办法
4272
查看次数