我想实现一个具有可选的用户提供的依赖项的插件,例如像一些 Gradle 其他插件允许:
dependencies {
// ...
dokkaPlugin(libs.dokka.versioning.plugin)
}
我设法在项目中创建了一个名为
configuration
的 myPlugin
:
val config = project.configurations.create("myPlugin")
所以现在,在使用我的插件的客户端项目中我可以这样做:
dependencies {
myPlugin("com.example:example:1.0.0")
}
问题是:如何应用我的配置来运行一些包含
myPlugin
依赖项的类路径的 java 代码?
这里还有一些上下文代码:
class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {
val extension = project.extensions.create<MyPluginExtension>("myPlugin")
val config = project.configurations.create("myPlugin")
val task = project.tasks.register<MyTask>("myTask") {
// ...
}
}
}
class MyTask : DefaultTask() {
@TaskAction
fun execute() {
val config = project.configurations.getByName("myPlugin")
// How to run some java code using this config?
}
}
我知道在我的插件编译期间,这些客户端提供的依赖项将不可用,因此我将无法直接使用
com.example:example
中的类。但我仍然想使用反射创建一些实例或使用 ServiceLoader
API 获取它们。
Configuration
扩展了 FileCollection
,因此它是一组文件的包装器。准备好后,您可以解析该配置并将其添加到类路径中。
Gradle 还有一个内置任务 JavaExec,您可以使用它来创建自己的执行 Java 程序的任务。
因此,您可以注册一个新任务并使用您要添加的所有相同项目对其进行配置,就像从命令行运行
java
命令一样:
tasks.register<MyRunTask>("myRunTask") {
args("something the program needs to know")
classpath(
theJarsWithTheCompiledCodeOfMyProgram, // Build this in a separate project
myNewConfiguration // Defined in the plugin for user's use
)
mainClass.set("the.main.clazz")
}