【问题标题】:How to use Arrow Meta with Android project如何在 Android 项目中使用 Arrow Meta
【发布时间】:2020-04-17 19:47:06
【问题描述】:

我尝试使用 Arrow Meta 为 Android 应用程序创建简单的编译器插件,基于示例代码。问题是使用XPlugin 参数失败并出现编译错误

kotlinOptions {
    jvmTarget = "1.8"
    freeCompilerArgs = ["-Xplugin=${project.rootDir}/plugin/core/build/libs/core-all.jar"]
}
e: java.lang.NoSuchMethodError: org.jetbrains.kotlin.com.intellij.openapi.extensions.impl.ExtensionsAreaImpl.getExtensionPoints()[Lorg/jetbrains/kotlin/com/intellij/openapi/extensions/impl/ExtensionPointImpl;

【问题讨论】:

  • 嗨@bari!你找到解决办法了吗?
  • 显然它与 android 应用程序无关,而是与您使用的 kotlin 版本有关。检查这个:github.com/arrow-kt/arrow-meta/issues/554。当我使用 1.3.61-SNAPSHOT 时,我决定降级到 kotlin 1.3.61,这个问题就消失了。

标签: android gradle plugins


【解决方案1】:

在过去的几周里,我一直在尝试在一个 Android 项目中使用箭头元,幸运的是,我可以在 Arrow 社区的帮助下让它工作。

在这里,您将找到一个discussion,了解如何将箭头元集成到 android 项目中。

这里有一个指向repo 的链接,我在其中使用箭头元。这是基于箭头社区发布的最新examples

基本上,您需要做的是创建插件,需要注意的是文件夹“create-plugin/src/main/resources/META-INF/services/”。在那里你必须创建一个名为“org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar”的文件,你需要在其中声明你的插件。

在我的仓库中关注这个link

然后你需要在你的 app:build.grradle 中编写下一行

android {
    kotlinOptions {
        jvmTarget = '1.8'
        freeCompilerArgs += "-Xplugin=${project.rootDir}/create-plugin/build/libs/create-plugin-all.jar"
    }
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
    compileTask -> compileTask.dependsOn ":create-plugin:createNewPlugin"
}

然后在你的 create-pluing:build.gradle 添加下一行:

import java.nio.file.Paths

dependencies {
    compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.4.10"
    compileOnly "org.jetbrains.kotlin:kotlin-compiler-embeddable:$kotlin_version"
    compileOnly "io.arrow-kt:compiler-plugin:1.4.10-SNAPSHOT"
}

// Create a new JAR with: Arrow Meta + new plugin
task createNewPlugin(type: Jar, dependsOn: classes) {
    archiveClassifier = "all"
    from 'build/classes/kotlin/main'
    from 'build/resources/main'
    from (
            zipTree(sourceSets.main.compileClasspath.find {
                it.absolutePath.contains(Paths.get("io.arrow-kt","compiler-plugin").toString())
            })
    ) {
        exclude 'META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar'
    }
}

需要注意的是kotlin版本和箭头meta版本是有关联的。

我使用 kotlin 版本 1.4.10 和箭头编译器插件版本 1.4.10-SNAPSHOT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2016-07-02
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多