gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:47:36 25 4
gpt4 key购买 nike

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

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

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

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

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

但是 build-helper 子项目显然不是首先构建的,尽管在 settings.gradle 中作为第一个并且构建失败,因为依赖关系未被识别。看起来 buildscript 是在构建子模块之前评估的,在其他任何事情之前。哦!

最佳答案

有两个主要用例

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

选项:

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

  2. 构造一个URLClassLoadersourceSets.main.runtimeClasspath 并通过类加载器加载/运行类

例如:

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()
}
}

关于java - 如何从 Gradle 调用自定义 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47056554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com