【问题标题】:How to configure the javafx plugin in a custom gradle plugin?如何在自定义 gradle 插件中配置 javafx 插件?
【发布时间】:2021-08-23 03:30:42
【问题描述】:

我是新手。我正在开发一个需要 JavaFX 的 kotlin 库。我想使用 gradle 来管理我的依赖项,并更容易将我的库包含在新项目中。

我的库项目应用并配置了 javafx 插件,其构建文件如下所示(kotlin dsl):

plugins {
    `java-library`
    id("org.openjfx.javafxplugin")
}

group = "me.shai"
version = "1.0"

javafx {
    version = "15.0.1"
    modules = listOf("javafx.controls", "javafx.fxml")
}

dependencies {
    // Other dependencies

    testImplementation(kotlin("test-junit5"))
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.6.0")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.6.0")
}

tasks.test {
    useJUnitPlatform()
}

kotlin {
    explicitApi()
}

显然,想要使用我的库的项目也必须应用和配置 JavaFX。下面是一个使用我的库的演示项目的构建文件示例:

plugins {
    id("org.openjfx.javafxplugin")
}

group = "me.shai"
version = "1.0"

javafx {
    version = "15.0.1"
    modules = listOf("javafx.controls", "javafx.fxml")
}

dependencies {
    implementation(project(":MyLib")) // Pretend the library is published so we use a url instead of local project
}

这有点烦人,所以我决定做一些类似于 JavaFX 的事情:编写一个自定义插件来包含我的项目。该插件需要:

  1. 将我的库添加为依赖项
  2. 应用 JavaFX 插件
  3. 配置 JavaFX 插件

我设法完成了第 1 步和第 2 步,但我卡在了第 3 步。如何从自定义插件 kotlin 类配置 JavaFX 插件?

这是我目前所拥有的:

package mylib.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.DependencyResolutionListener
import org.gradle.api.artifacts.ResolvableDependencies
import org.gradle.kotlin.dsl.project

class MyLibPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        // Apply the javafx plugin
        project.plugins.apply("org.openjfx.javafxplugin")
        // How to configure javafx here?

        val implementationDeps = project.configurations.getByName("implementation").dependencies
        project.gradle.addListener(object : DependencyResolutionListener {
            override fun beforeResolve(dependencies: ResolvableDependencies) {
                // Add dependency on my library project.
                implementationDeps.add(project.dependencies.project(":MyLib"))
                project.gradle.removeListener(this)
            }

            override fun afterResolve(dependencies: ResolvableDependencies) {}
        })
    }
}

我基本上是在尝试编写构建脚本块的等价物:

javafx {
    version = "15.0.1"
    modules = listOf("javafx.controls", "javafx.fxml")
}

我不知道如何实现这一点。如有任何关于此主题的帮助,我将不胜感激。

【问题讨论】:

    标签: kotlin gradle javafx gradle-plugin


    【解决方案1】:

    您可以像在构建文件中一样配置javafx 扩展:

    // build.gradle[.kts]
    dependencies {
        implementation("org.openjfx:javafx-plugin:0.0.10")
    }
    

    以及插件实现:

    import org.gradle.api.Plugin
    import org.gradle.api.Project
    import org.gradle.api.plugins.JavaPlugin
    import org.openjfx.gradle.JavaFXOptions
    
    open class MyLibPlugin : Plugin<Project> {
    
        override fun apply(project: Project) {
            project.pluginManager.apply("org.openjfx.javafxplugin")
    
            val myLibDependency = project.dependencies.project(mapOf("path" to ":MyLib"))
            project.dependencies.add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, myLibDependency)
    
            project.extensions.configure(JavaFXOptions::class.java) {
                it.version = "15.0.1"
                it.modules = listOf("javafx.controls", "javafx.fxml")
            }
        }
    
    }
    

    【讨论】:

    • 我试过这个,但在导入语句中出现错误Unresolved reference: openjfx。也许我在插件构建文件中遗漏了一些东西?
    • 确保你有正确的依赖;见修改后的编辑。
    • 还是不行。现在我在构建文件中得到Could not find org.openjfx:javafx-plugin:0.0.10。是否有可能是在不同的存储库中定义的?
    • @ShaiAvr 你确定你在构建文件中有repositories { gradlePluginPortal() } 块吗?
    猜你喜欢
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多