我正在使用Gradle创建构建过程,我想提供一个使用Java代码的插件。 Gradle plugin documentation 表示这是可能的:
您可以使用您喜欢的任何语言实现自定义插件,前提是实现最终编译为字节码。对于这里的示例,我们将使用Groovy作为实现语言。如果需要,可以使用Java或Scala。
然而,经过多个小时的谷歌搜索和阅读,我还没有找到任何解释如何使用Java创建Gradle自定义插件。您似乎可以在以下目录中为其创建代码:
<rootProjectDir>/buildSrc/src/main/java/
MyGradlePlugin.java
MyGradleTasks.java
但问题就变成了:
如何让Gradle识别Java类和任务,以便在构建中使用它们?
你能像引用Groovy一样引用插件类吗?
src/main/resources/META-INF/gradle-plugins/myjavaplugin.properties
implementation-class=org.me.MyGradlePlugin
我意识到我可以用project.javaexec
或JavaExec
调用Java代码,但我担心这会使我的构建过程不那么便携。
答案 0 :(得分:67)
这是一个基本的,独立的,基于Java的Gradle插件以及使其运行的步骤:
<projectRoot>/plugin
目录$ gradle uploadArchives
这个(非常重要的)步骤编译Java代码并将其放入您当地的Maven仓库(../ repo)。<projectRoot>/consumer
$ gradle checkitout
<强> projectRoot /插件/ SRC /主/ JAVA /组织/ joefernandez / gradle这个/ MyJavaPlugin.java 强>
package org.joefernandez.gradle;
import org.gradle.api.Project;
import org.gradle.api.Plugin;
public class MyJavaPlugin implements Plugin<Project> {
@Override
public void apply(Project target) {
target.task("javaTask");
}
}
<强> projectRoot /插件/ SRC /主/ JAVA /组织/ joefernandez / gradle这个/ MyJavaTask.java 强>
package org.joefernandez.gradle;
import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;
public class MyJavaTask extends DefaultTask {
@TaskAction
public void javaTask() {
System.out.println("Hello from MyJavaTask");
}
}
<强> projectRoot /插件/ SRC /主/资源/ META-INF / gradle这个-插件/ test-plugin.properties 强>
implementation-class=org.joefernandez.gradle.MyJavaPlugin
请注意 uploadArchives 任务:您必须运行此任务才能使插件可供使用者脚本使用。
<强> projectRoot /插件/的build.gradle 强>
apply plugin: 'java'
dependencies {
compile gradleApi()
}
apply plugin: 'maven'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.11'
}
group = 'org.joefernandez'
version = '1.0-SNAPSHOT'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
<强> projectRoot /插件/ settings.gradle 强>
rootProject.name = 'MyJavaPlugin'
<强> projectRoot /的build.gradle 强>
apply plugin: 'java'
dependencies {
compile gradleApi()
}
<强> projectRoot /消费者/的build.gradle 强>
buildscript {
repositories {
maven {
url uri('../repo')
}
}
dependencies {
classpath group: 'org.joefernandez',
name: 'MyJavaPlugin',
version: '1.0-SNAPSHOT'
}
}
apply plugin: 'test-plugin'
task checkitout(type: org.joefernandez.gradle.MyJavaTask) {
println("running consumer task!")
}
答案 1 :(得分:23)
我想对乔的伟大答案提出一些修正。
<强> projectRoot /插件/ SRC /主/ JAVA /组织/ joefernandez / gradle这个/ MyJavaPlugin.java 强>
此更改将任务连接到提供的项目,而无需对其进行子类化。
package org.joefernandez.gradle;
import org.gradle.api.Project;
import org.gradle.api.Plugin;
public class MyJavaPlugin implements Plugin<Project> {
@Override
public void apply(Project target) {
// CHANGE HERE
target.getTasks().create("javaTask", MyJavaTask.class);
}
}
<强> projectRoot /消费者/的build.gradle 强>
此更改将删除现在不必要的任务定义
buildscript {
repositories {
maven {
url uri('../repo')
}
}
dependencies {
classpath group: 'org.joefernandez',
name: 'MyJavaPlugin',
version: '1.0-SNAPSHOT'
}
}
apply plugin: 'test-plugin'
// CHANGE HERE
他们将步骤6更改为:
Execute the script that depends on the plugin: $ gradle javaTask
答案 2 :(得分:3)
插件类必须实现org.gradle.api.Plugin
接口。任务类通常扩展org.gradle.api.DefaultTask
类。使用哪种(JVM)语言并不重要。 Gradle代码库包含许多用Java实现的插件和任务类。
如何构建和发布插件是另一个问题,与使用哪种语言无关。请参阅完整Gradle分发中的Gradle User Guide和samples/customPlugin
。