如何从Gradle调用自定义Java方法

时间:2017-11-01 13:55:34

标签: java gradle

请问,如何在Gradle构建脚本中调用Java方法最方便的方法是什么?此方法包含我想在构建期间使用的功能;一个功能太复杂,无法作为脚本Groovy方法,但不足以命令完全自定义Gradle插件。

我的问题不是关于从Gradle运行Java应用程序。这将涉及分支JVM,并且没有简单的方法如何将输出发布回Gradle,我需要输出。

最初我的代码在src / main / java中,但必须尽早编译才能在Gradle构建脚本中调用。

然后我尝试将构建助手类移动到子模块项目,一个子类子模块,希望在调用主构建脚本之前构建子模块;我放在那里:

 buildscript {
    dependencies {
       classpath 'this.project:build-helper:1.0-SNAPSHOT'
    }
 }

build-helper子项目显然不是首先构建的,尽管在settings.gradle中作为第一个并且构建失败,因为无法识别依赖项。似乎在构建子模块之前,在其他任何事情之前评估了buildscript。 d'!哦

2 个答案:

答案 0 :(得分:2)

有两个主要用例

源位于当前项目中的src/main/java - 因此,在定义buildscript类路径时该类不存在

选项:

  1. 使用JavaExec任务在另一个JVM中运行该类

  2. sourceSets.main.runtimeClasspath构建URLClassLoader并通过类加载器加载/运行该课程

  3. 例如:

    task doStuff {
        doLast {
            URL[] urls = sourceSets.main.runtimeClasspath.files as URL[]
            def classloader = new URLClassLoader(urls, null)
            Class myClass = classloader.load("foo.bar.MyClass")
            def myInstance = myClass.newInstance()
            Method method = myClass.getMethod("doStuff")
            method.invoke(myInstance)
        }
    }
    

    源位于另一个项目中。 - 因此,在定义buildscript类路径之前,该类将存在

    在这种情况下,您可以将项目添加到buildscript类路径并调用它

    buildscript {
        dependencies {
            classpath project(':other-project')
        }
    }
    task doStuff {
        doLast {
            def myClass = new MyClass()
            myClass.doStuff()
        }
    }
    

答案 1 :(得分:2)

所以最简单的方法是将我的构建助手Java源代码放入buildSrc目录:<project root dir>/buildSrc/src/main/java/foo/bar/Extractor.java,就是这样,你可以直接从Gradle构建脚本的任何地方调用new Extractor(..).extratMetadata(...),不需要要导入包,不需要使用Java插件,默认情况下Gradle理解Maven就像buildScr下的目录结构一样。

致记:https://zeroturnaround.com/rebellabs/using-buildsrc-for-custom-logic-in-gradle-builds/