使用Java创建Gradle自定义插件 [英] Creating a Gradle Custom Plugin with Java

查看:140
本文介绍了使用Java创建Gradle自定义插件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用Gradle创建一个构建过程,我想提供一个使用Java代码的插件。 Gradle 插件文档 这是可能的:


您可以使用您喜欢的任何语言实现自定义插件,只要实现最终编译为字节码即可。对于这里的例子,我们将使用Groovy作为实现语言。如果你愿意的话,你可以使用Java或Scala。


然而,经过多个小时的谷歌搜索和阅读,我还没有找到有关如何使用Java创建Gradle自定义插件的任何说明。您可以在如下目录中创建代码:

 < rootProjectDir> / buildSrc / src / main / java / 
MyGradlePlugin.java
MyGradleTasks.java

但问题变成:


  1. 如何在Java中实现插件类和任务以与Gradle兼容?

  2. 如何让Gradle识别Java类和任务,以便您可以在构建中使用它们?



    您能像引用Groovy等同的插件类一样引用插件类吗?

    src / main / resources / META-INF / gradle-plugins / myjavaplugin.properties
    implementation-class = org.me。 MyGradlePlugin




  3. 我意识到我可以用<$ c $来调用Java代码c> project.javaexec JavaExec ,但我担心这会使我的构建过程变得更加便携。

    解决方案

    这是一个基本的,独立的,基于Java的Gradle插件及其工作步骤:


  4. 确保安装了Gradle 1.6或更高版本并安装了Java JDK
  5. 使用指定的目录结构在以下创建这些文件
  6. 将目录切换到< projectRoot> / plugin 目录

  7. 执行插件构建: $ gradle uploadArchives 这个(非常重要的)步骤编译Java代码并将其放入本地Maven repo(../ repo)。
  8. 现在通过将目录更改为< projectRoot> / consumer

  9. 执行取决于插件的脚本: $ gradle checkitout



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:

  1. How to implement the plugin class and tasks in Java to be compatible with Gradle?
  2. 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:

  1. Make sure Gradle 1.6 or higher and Java JDK is installed
  2. Create these files below with the directory structure indicated
  3. Change directories to the <projectRoot>/plugin directory
  4. Execute the plugin build: $ gradle uploadArchives This (very important) step compiles the Java code and puts it in your local Maven repo (../repo).
  5. Now execute the consumer script by changing directories to <projectRoot>/consumer
  6. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆