使用Java创建Gradle自定义插件 [英] Creating a Gradle Custom Plugin with Java
问题描述
我正在用Gradle创建一个构建过程,我想提供一个使用Java代码的插件。 Gradle 插件文档 说这是可能的:
您可以使用您喜欢的任何语言实现自定义插件,只要实现最终编译为字节码即可。对于这里的例子,我们将使用Groovy作为实现语言。如果你愿意的话,你可以使用Java或Scala。
然而,经过多个小时的谷歌搜索和阅读,我还没有找到有关如何使用Java创建Gradle自定义插件的任何说明。您可以在如下目录中创建代码:
< rootProjectDir> / buildSrc / src / main / java /
MyGradlePlugin.java
MyGradleTasks.java
但问题变成:
- 如何在Java中实现插件类和任务以与Gradle兼容?
-
如何让Gradle识别Java类和任务,以便您可以在构建中使用它们?
您能像引用Groovy等同的插件类一样引用插件类吗?
src / main / resources / META-INF / gradle-plugins / myjavaplugin.properties
implementation-class = org.me。 MyGradlePlugin
- 确保安装了Gradle 1.6或更高版本并安装了Java JDK
- 使用指定的目录结构在以下创建这些文件
- 将目录切换到
< projectRoot> / plugin
目录 - 执行插件构建:
$ gradle uploadArchives
这个(非常重要的)步骤编译Java代码并将其放入本地Maven repo(../ repo)。
- 现在通过将目录更改为
< projectRoot> / consumer
- 执行取决于插件的脚本:
$ gradle checkitout
我意识到我可以用<$ c $来调用Java代码c> project.javaexec 或 JavaExec
,但我担心这会使我的构建过程变得更加便携。
这是一个基本的,独立的,基于Java的Gradle插件及其工作步骤:
Java类
projectRoot / plugin / src / main / java / org / joefernandez / gradle / MyJavaPlugin.java
package org.joefernandez.gradle;
import org.gradle.api.Project;
import org.gradle.api.Plugin;
公共类MyJavaPlugin实现插件< Project> {
@Override
public void apply(Project target){
target.task(javaTask);
}
}
projectRoot / plugin / src / main / java / org / joefernandez / gradle / MyJavaTask.java
package org.joefernandez.gradle;
导入org.gradle.api.DefaultTask;
导入org.gradle.api.tasks.TaskAction;
public class MyJavaTask extends DefaultTask {
@TaskAction
public void javaTask(){
System.out.println(Hello from MyJavaTask) ;
}
}
插件类声明
$ b $ p projectRoot / plugin / src / main / resources / META-INF / gradle-plugins / test-plugin.properties
implementation-class = org.joefernandez.gradle.MyJavaPlugin
插件构建脚本
请注意 uploadArchives 任务:必须运行此任务才能使插件可供消费者脚本使用。
projectRoot / plugin / build.gradle
apply plugin:'java'
dependencies {
compile gradleApi()
}
apply plugin:'maven'
存储库{
mavenCentral()
}
依赖关系{
testCompile'junit:junit:4.11'
}
group ='org.joefernandez'
version ='1.0-SNAPSHOT'
uploadArchives {
repositories {
mavenDeployer {
资料库(网址:uri('../ repo'))
}
}
}
插件设置
projectRoot / plugin / settings.gradle $ b
rootProject.name ='MyJavaPlugin'
根脚本
projectRoot / build.gradle
apply plugin:'java'
dependencies {
compile gradleApi()
}
使用者脚本
projectRoot / consumer / build.gradle $ b
buildscript {
repositories {
maven {
url uri('../ repo')
}
}
依赖项{
classpath组:'org.joefernandez',
名称:'MyJavaPlugin',
版本:'1.0-SNAPSHOT'
}
}
套用插件:'test-plugin'
任务checkitout(类型:org.joefernandez.gradle.MyJavaTask){
println(running consumer task!)
}
I'm creating a build process with Gradle and I want to provide a plugin that uses Java code. The Gradle plugin documentation says this is possible:
You can implement a custom plugin in any language you like, provided the implementation ends up compiled as bytecode. For the examples here, we are going to use Groovy as the implementation language. You could use Java or Scala instead, if you want.
However, after multiple hours of Googling and reading, I have yet to find any explanation of how to create a Gradle custom plugin with Java. It seems like you could create the code for it in a directory like:
<rootProjectDir>/buildSrc/src/main/java/
MyGradlePlugin.java
MyGradleTasks.java
But the question then becomes:
- How to implement the plugin class and tasks in Java to be compatible with Gradle?
How to get Gradle to recognize the Java classes and tasks so you can use them in a build?
Can you just reference the plugin class like you do for the Groovy equivalent?
src/main/resources/META-INF/gradle-plugins/myjavaplugin.properties
implementation-class=org.me.MyGradlePlugin
I realize that I could just call the Java code with project.javaexec
or JavaExec
, but I'm concerned this will make my build process less portable.
Here's a basic, stand-alone, Java-based Gradle plugin and the steps to get it working:
- Make sure Gradle 1.6 or higher and Java JDK is installed
- Create these files below with the directory structure indicated
- Change directories to the
<projectRoot>/plugin
directory - Execute the plugin build:
$ gradle uploadArchives
This (very important) step compiles the Java code and puts it in your local Maven repo (../repo). - Now execute the consumer script by changing directories to
<projectRoot>/consumer
- Execute the script that depends on the plugin:
$ gradle checkitout
Java Classes
projectRoot/plugin/src/main/java/org/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/plugin/src/main/java/org/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");
}
}
Plugin Class declaration
projectRoot/plugin/src/main/resources/META-INF/gradle-plugins/test-plugin.properties
implementation-class=org.joefernandez.gradle.MyJavaPlugin
Plugin Build Script
Note the uploadArchives task: You must run this task to make the plugin available to the consumer script.
projectRoot/plugin/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'))
}
}
}
Settings for the Plugin
projectRoot/plugin/settings.gradle
rootProject.name = 'MyJavaPlugin'
Root script
projectRoot/build.gradle
apply plugin: 'java'
dependencies {
compile gradleApi()
}
Consumer script
projectRoot/consumer/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!")
}
这篇关于使用Java创建Gradle自定义插件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!