当前位置: 首页 > 面试题库 >

使用Java创建Gradle自定义插件

松旻
2023-03-14
问题内容

我正在用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

我意识到我可以使用project.javaexec或调用Java代码JavaExec,但是我担心这会使我的构建过程变得不那么容易移植。


问题答案:

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

  1. 确保Gradle 1.6或更高版本并安装了Java JDK
  2. 使用指定的目录结构在下面创建这些文件
  3. <projectRoot>/plugin目录更改为目录
  4. 执行插件构建:$ gradle uploadArchives此步骤(非常重要)将编译Java代码并将其放入本地Maven存储库(../repo)中。
  5. 现在,通过将目录更改为 <projectRoot>/consumer
  6. 执行依赖于插件的脚本: $ gradle checkitout

Java类

projectRoot /插件/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 /插件/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");
    }

}

插件类声明

projectRoot /插件/src/main/resources/META-INF/gradle-plugins/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!")
}


 类似资料:
  • 我有个小问题。 我创建了自定义gradle插件(独立插件),并将它从mavenlocal包含在我的简单项目中。它正在工作,但我不知道如何在我的插件中设置系统属性。更多细节:在我的插件中,在任务中,我想设置系统属性(system.setproperty(key,value))并从我的主应用程序中获取它的属性,例如在main类main方法中,但main方法不使用此属性 当我在构建中创建任务时。grad

  • 我为gradle创建了一个简单的基于groovy的插件。 在我的毕业典礼上。构建文件我有以下内容: 一切都很好,我得到了一个构建目录和一个. jar在lib文件夹中生成,我想这是独立的插件。 现在我想知道如何将这个新插件注册到我的gradle安装中,这样我就可以应用插件了:“myPlugin”我做了以下工作: 将插件放入安装中的插件文件夹 创建了myplugin.properties文件并将其包含

  • 问题内容: 我正在尝试创建一个具有自定义形状(六边形)的按钮,但其行为类似于普通的JButton(即与ActionListener一起使用)。 我创建了一个扩展AbstractButton的类,但是单击它似乎不会向ActionListener发送事件。如果我更改类以扩展JButton,则它可以很好地工作,但是会弄乱按钮的显示方式。我假设有一种方法需要重写才能引发事件,但是我不知道它是什么。 问题答

  • 下面的这些代码可以帮助您通过CSS文件和SCSS文件,创建和编译 CSS 和 JS 文件的source-maps。 安装依赖 为了运行编译和压缩任务,你必须安装 node 和 npm。 命令行 // (Optional) Install Gulp module globally npm install gulp -g // Install fullpage's build dependen

  • 问题内容: 我想问一个与这个问题相同的问题,但使用SWT:是否有一种方法可以制作带有您自己的按钮图形的按钮,而不仅仅是按钮内的图像?如果不是,这是在Java中创建自定义按钮的另一种方法吗? 问题答案: public class ImageButton extends Canvas { private int mouse = 0; private boolean hit = false;

  • 我正在使用私有Maven存储库的有限开发环境中工作。里面有一个Gradle插件,我正在尝试使用它。然而,我认为它没有遵循Gradle插件的预期命名和目录结构,所以当我使用PluginDSL时,我的构建失败了。在Maven存储库中,插件的结构如下: 当我使用以下定义使用 Gradle 插件 DSL 引用此插件时: 我的构建版本出现错误,抱怨它找不到.plugin但是,似乎没有通过插件DSL来指示插件