【发布时间】: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 的事情:编写一个自定义插件来包含我的项目。该插件需要:
- 将我的库添加为依赖项
- 应用 JavaFX 插件
- 配置 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