所以我想知道如何使用Gradle用开源的Kotlin项目https://github.com/mobile-dev-inc/dadb来编译我的Android应用程序.我能够在它们中成功地运行./gradlew assemble,但是我希望有一个根目录,可以将它们作为子项目进行编译.我认为复杂的原因是dadb有自己的子项目dadb,这使得它变得更加棘手.这是我试图从根目录编译的当前错误:

1: Task failed with an exception.
-----------
* Where:
Build file '/home/tron/AndroidStudioProjects/cookie/dadb/dadb/build.gradle.kts' line: 4

* What went wrong:
Script compilation errors:

  Line 04: import org.gradle.jvm.toolchain.internal.JavaToolchainFactory
                                                    ^ Unresolved reference: JavaToolchainFactory

  Line 29: val toolchainFactory = objects.newInstance(JavaToolchainFactory::class.java)
                                          ^ Not enough information to infer type variable T

这是我的根settings.gradle.kts:

pluginManagement {
    repositories {
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "cookie"
include(":app")
include(":dadb")
include(":dadb:dadb") 

这是我的build.gradle.kts分:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    alias(libs.plugins.androidApplication) apply false
    alias(libs.plugins.jetbrainsKotlinAndroid) apply false
}          

这是dadb/dadb‘S build.gradle.kts:

import org.gradle.internal.jvm.inspection.DefaultJvmMetadataDetector
import org.gradle.internal.os.OperatingSystem
import org.gradle.jvm.toolchain.internal.DefaultToolchainSpec
import org.gradle.jvm.toolchain.internal.JavaToolchainFactory
import org.gradle.jvm.toolchain.internal.JavaToolchainInput

plugins {
    `maven-publish`
    id("org.jetbrains.kotlin.jvm")
    id("com.vanniktech.maven.publish")
    `java-library`
    id("com.palantir.graal") version "0.9.0"
    id("org.graalvm.buildtools.native") version "0.9.5"
}

repositories {
    mavenCentral()
}

dependencies {
    api("com.squareup.okio:okio:2.10.0")
    implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    testImplementation("org.jetbrains.kotlin:kotlin-test")
    testImplementation("com.google.truth:truth:1.0.1")
}

val toolchainFactory = objects.newInstance(JavaToolchainFactory::class.java)
val metadataDetector = objects.newInstance(DefaultJvmMetadataDetector::class.java)

graal {
    graalVersion("21.0.0.2")
}

tasks.test {
    useJUnitPlatform()
}

tasks.nativeTestCompile {
    dependsOn(tasks.extractGraalTooling)
}

graalvmNative {
    binaries {
        all {
            buildArgs.add("-H:+EnableAllSecurityServices")
            javaLauncher.set(provider {
                val output = tasks.extractGraalTooling.get().outputs.files.singleFile
                val javaHome = if (OperatingSystem.current().isMacOsX) output.resolve("Contents/Home") else output
                val metadata = metadataDetector.getMetadata(javaHome)
                if (!metadata.isValidInstallation) {
                    throw RuntimeException(metadata.errorMessage)
                }
                val spec = objects.newInstance(DefaultToolchainSpec::class.java).apply {
                    languageVersion.set(JavaLanguageVersion.of(java.targetCompatibility.majorVersion))
                }
                val javaToolchain = toolchainFactory.newInstance(javaHome, JavaToolchainInput(spec))
                javaToolchain.get().javaLauncher
            })
        }
    }
}

这是Dadb的settings.gradle.kts:

rootProject.name = "dadb"
include("dadb")

如有任何帮助,将不胜感激!

推荐答案

在Gradle的最新版本中不存在org.gradle.jvm.toolchain.internal.JavaToolchainFactory,因此您会遇到问题.

我看到DADB是用Gradle7.2(GitHub)构建的,所以它显然与该版本兼容.如果您降级到7.2版,那么它应该可以编译.

Kotlin相关问答推荐

最好的方法来创建一个 map 在kotlin从两个列表

如何在Kotlin中为两个数据类创建可重用的方法?

Spring Boot Bean验证器未触发

在KMM合成多平台中创建特定于平台的视图

何时使用figureEach

Kotlin编译器如何决定是否可以在任何给定点调用Suspend方法?

Kotlin Coroutine()是如何工作的?S阻止了.

Kotlin Poet 的导入不明确

使用 kotlin 流删除 map 中具有某些相似性的值

将一个列表元素分组为多个组(indexBy)

区分函数和扩展

为 Gradle 子项目配置 Kotlin 扩展

如何从kotlin中的ArrayList中删除所有元素

为什么 Dialog 没有 NavController [Missing]?

Android EditText 协程go 抖操作符,如 RxJava

用于代码生成的ANTLR工具版本4.7.1与当前运行时版本4.5.3不匹配

如果kotlin已经有了getter和setter,为什么在数据类中有componentN函数?

lateinit 的 isInitialized 属性在伴随对象中不起作用

Kotlin:测试中的 java.lang.NoSuchMethodError

Android Jetpack Compose - 图像无法zoom 到框的宽度和高度