gpt4 book ai didi

java - 在运行时将 Groovy 脚本导入另一个 Groovy 脚本

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:06 24 4
gpt4 key购买 nike

我有一个看起来像这样的 Groovy 文件(当前)。

主要的.groovy

import org.packages.mystuff.JavaClassIAmUsing;
public class MyObject {

def rate(item){
def o = evaluate(new File (new File(getClass().protectionDomain.codeSource.location.path).parent),"CommonFunctions.groovy");
println o.whoami();

}
}

我有另一个 groovy 文件叫做

CommonFunctions.groovy

def whoami() {return 'no body';}

我正在尝试将 CommonFunctions 脚本包含到 main 脚本中,但是在构建时不知道脚本的位置(即我无法硬编码脚本中的绝对文件路径或与脚本存储位置相关的 java 进程的绝对路径)。

我所知道的是脚本将放在一起或位于与调用脚本相关的位置(比如子目录)。

我尝试定位调用脚本位置,但出现错误

  No signature of method: MyObject.evaluate()

考虑到主脚本是在运行时使用 GroovyClassLoader.parseClass(File) 方法访问的,我该如何引用这个脚本。

最佳答案

我不太确定你为什么要这样做,我认为创建一个你可以正常实例化并在任何地方使用的 CommonsFunctions 类会简单得多。

但是,可以实现您想要的;使用 Groovy,没有那么多限制......

您建议的解决方案有两个问题:

    您的 MyObject 类中的
  1. getClass() 自然是指 ... MyObject 类,因此您尝试查找脚本位置的尝试将会失败。您走在正确的轨道上,但您需要使用周围的脚本类来解析脚本位置。
  2. evaluate 并不像您想象的那样有效。 evaluate 方法的结果是脚本的结果,而不是 Script 类的实例。一种补救方法是将 CommonFunction 中的方法重写为闭包属性。在评估脚本时,这些属性将在 shell Binding 对象中可用。

因此,通过这些重写,您最终会得到如下结果:

ma​​in.groovy

class MyObject {
def scriptDir

def rate(item) {
def commonFunctionsScriptFile = new File(scriptDir, "CommonFunctions.groovy")
def binding = new Binding()
new GroovyShell(binding).evaluate(commonFunctionsScriptFile)
println binding.variables.whoami()
}
}

scriptFile = new File(getClass().protectionDomain.codeSource.location.path)
new MyObject(scriptDir: scriptFile.parentFile).rate(null)

这里,脚本文件位置是在脚本中解析的,而不是在内部类中。

CommonFunctions.groovy

whoami = { 'no body' }

在这里,whoami 不再是一个方法,而是一个将被添加到绑定(bind)中的闭包属性。请确保您在此属性前加上def 前缀,因为这样它将是一个局部变量,而不是添加到绑定(bind)对象的属性。

这些重写后的输出是预期的:no body

关于java - 在运行时将 Groovy 脚本导入另一个 Groovy 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15389499/

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