标签: groovyshell

Grails shell没有看到域对象

我是一个grails新手(和一个时髦的新手),我正在通过一些grails教程.作为一个新用户,grails shell对我来说是一个非常有用的小工具,但我无法弄清楚如何让它看到我的类和对象.这是我正在尝试的:

% grails create-app test
% cd test
% grails create-domain-class com.test.TestObj
% grails shell
groovy:000> new TestObj()
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_evaluate: 2: unable to resolve class TestObj
Run Code Online (Sandbox Code Playgroud)

我的印象是grails shell可以看到所有控制器,服务和域对象.怎么了?我需要在这里做点什么吗?

我尝试了另外一件事:

groovy:000> foo = new com.test.TestObj();
===> com.test.TestObj : null
groovy:000> foo.save 
ERROR groovy.lang.MissingPropertyException: No such property: save for class: com.test.TestObj
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑:好的,我看到了关于使用全名和使用.save()而不是使用的答案.save.但是这个怎么样?

groovy:000> new com.test.TestObj().save()
ERROR org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here …
Run Code Online (Sandbox Code Playgroud)

grails groovy groovyshell

6
推荐指数
1
解决办法
3517
查看次数

用于评估 Java 应用程序中的 groovy 脚本的 Maven 依赖项

我添加了使用 GroovyShell 在我的 Java 应用程序中解析和评估 groovy 脚本的功能。哪个 Maven 工件是我的构建中包含的最低限度?

我知道 groovy-all 肯定会包含我需要的一切,但我猜我也可以使用一个更小的包?

groovy groovyshell

6
推荐指数
1
解决办法
1808
查看次数

如何将多个 jars 添加到 groovyConole/groovysh 的类路径?

我不得不问这个问题感觉很荒谬,但我似乎无法将多个 jar 文件添加到 groovyConsole 和 groovysh 的类路径中。如何将多个 jar 文件添加到类路径?这是我尝试过的:

groovyConsole -cp ~/lib/compile/jar/mysql-connector-java-5.1.32.jar:~/lib/compile/jar/ojdbc6-11.2.0.3.jar

但是,当我在控制台中执行此代码时,我得到以下信息:

 file:/Users/charlie/lib/compile/jar/mysql-connector-java-5.1.32.jar
 file:/Users/charlie/projects/fuseanalytics/./
 file:/Users/charlie/.gvm/groovy/current/lib/ant-1.9.3.jar
 file:/Users/charlie/.gvm/groovy/current/lib/ant-antlr-1.9.3.jar
 file:/Users/charlie/.gvm/groovy/current/lib/ant-junit-1.9.3.jar
 file:/Users/charlie/.gvm/groovy/current/lib/ant-launcher-1.9.3.jar
 file:/Users/charlie/.gvm/groovy/current/lib/bsf-2.4.0.jar
 file:/Users/charlie/.gvm/groovy/current/lib/commons-cli-1.2.jar
 file:/Users/charlie/.gvm/groovy/current/lib/commons-logging-1.1.1.jar
 file:/Users/charlie/.gvm/groovy/current/lib/gpars-1.2.1.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-ant-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-bsf-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-console-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-docgenerator-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-groovydoc-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-groovysh-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-jmx-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-json-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-jsr223-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-nio-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-servlet-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-sql-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-swing-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-templates-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-test-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-testng-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/groovy-xml-2.3.6.jar
 file:/Users/charlie/.gvm/groovy/current/lib/hamcrest-core-1.3.jar
 file:/Users/charlie/.gvm/groovy/current/lib/ivy-2.3.0.jar
 file:/Users/charlie/.gvm/groovy/current/lib/jansi-1.11.jar
 file:/Users/charlie/.gvm/groovy/current/lib/jcommander-1.35.jar
 file:/Users/charlie/.gvm/groovy/current/lib/jline-2.11.jar
 file:/Users/charlie/.gvm/groovy/current/lib/jsp-api-2.0.jar
 file:/Users/charlie/.gvm/groovy/current/lib/jsr166y-1.7.0.jar
 file:/Users/charlie/.gvm/groovy/current/lib/junit-4.11.jar
 file:/Users/charlie/.gvm/groovy/current/lib/multiverse-core-0.7.0.jar
 file:/Users/charlie/.gvm/groovy/current/lib/qdox-1.12.1.jar
 file:/Users/charlie/.gvm/groovy/current/lib/servlet-api-2.4.jar
 file:/Users/charlie/.gvm/groovy/current/lib/testng-6.8.8.jar
 file:/Users/charlie/.gvm/groovy/current/lib/xmlpull-1.1.3.1.jar
 file:/Users/charlie/.gvm/groovy/current/lib/xstream-1.4.7.jar
Run Code Online (Sandbox Code Playgroud)

请注意,第一个 jar 文件 mysql jar 文件已添加到类加载器中,但未添加第二个 jar 文件 oracle jar 文件。我也试过两次使用 -cp 参数,例如:

 groovyConsole -cp ~/lib/compile/jar/mysql-connector-java-5.1.32.jar -cp ~/lib/compile/jar/ojdbc6-11.2.0.3.jar
Run Code Online (Sandbox Code Playgroud)

但这只是失败并出现错误。这些文档显然没有任何指导,除了模糊的暗示它像 Java 一样工作。因此,为什么第一次尝试没有开箱即用如此令人沮丧。

我还尝试在使用 Script > Add …

groovy groovyshell jar groovy-console

6
推荐指数
1
解决办法
4801
查看次数

如何在启动时向groovysh添加导入?

我正在一个项目中,我希望用户在Groovysh上尝试Java类。我想为他们提供方便,并希望在groovysh启动时默认导入某些软件包,这样用户每次启动shell时都不必重新键入相同的导入。有谁知道如何做到这一点?

在此先感谢,伊戈尔

groovy groovyshell

5
推荐指数
1
解决办法
1288
查看次数

在 groovy shell 中使用 groovy 类别

我正在使用 Groovy 类别在一些 DSL 下工作,我想找到一种方法来将我的 DSL 与 groovy shell 一起使用,而无需use(MyCategory){ myObject.doSomething() }为每个命令显式编写。

例如,假设我有以下玩具类别:

class MyCategory {
    static Integer plus(Integer integer, String string){
        return integer + Integer.valueOf(string)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以通过groovysh以下方式使用此类别:

groovy> use(MyCategory){ 2 + '3' } //gives 5
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法MyCategory为所有groovysh命令全局设置,这样就没有必要每次都将我的命令包装在use(MyCategory) { ... }?例如:

groovy> useGlobally(MyCategory); //call something like this only once
groovy> 2 + '3' //automatically uses MyCategory and gives 5
Run Code Online (Sandbox Code Playgroud)

dsl groovy groovyshell

5
推荐指数
1
解决办法
216
查看次数

为什么groovyConsole支持`def name ="Neo"`而groovysh不支持

以下是2行代码:

def name = "Neo"
println name
Run Code Online (Sandbox Code Playgroud)

如果我执行它groovysh,我会得到Unknown property: name错误.如果我执行它groovyConsole,一切都很顺利.

groovy groovyshell groovy-console

5
推荐指数
1
解决办法
437
查看次数

Java + Groovy脚本 - 继承

我在Groovy脚本中有继承问题.我希望我的Groovy脚本从我调用此脚本的Java类继承方法.

例如,我有这样的事情:

public class SimpleTest extends TestCase {

public void test(){
    CompilerConfiguration configuration = new CompilerConfiguration();
    configuration.setScriptBaseClass(this.getClass().getName());
    GroovyShell shell = new GroovyShell(this.getClass().getClassLoader(), new Binding(), configuration);
    shell.evaluate("println sayHello()");
}

public String sayHello(){
    return "Hello";
}
}
Run Code Online (Sandbox Code Playgroud)

错误是:

org.codehaus.groovy.control.MultipleCompilationErrorsException:startup failed:Script1.groovy:1:声明类型com.test.SimpleTest不扩展groovy.lang.Script类!@第1行,第1列.println sayHello()^ 1错误

如果我不能继承任何其他类,我怎么能这样做?我只想从超类中调用方法.

编辑

我改变了我的课程:

public class CmTest extends TestCase {

public void test(){
    GroovyHandler handler = new GroovyHandler();
    handler.run();
}

public String sayHello(){
    return "Hello";
}

public class GroovyHandler extends Script {

    public GroovyHandler(){
    }

    @Override
    public Object run() {
        CompilerConfiguration …
Run Code Online (Sandbox Code Playgroud)

java groovy inheritance groovyshell

5
推荐指数
1
解决办法
1871
查看次数

groovysh找不到方法

我将以下脚本加载到groovysh中:

def a() {
    println "a()"
}

def b() {
    println "b()"
    a()
}
Run Code Online (Sandbox Code Playgroud)

通过使用:load 'test.groovy'和调用方法b():

b()
Run Code Online (Sandbox Code Playgroud)

我明白了:

groovy:000> b()
b()
No signature of method: groovysh_evaluate.a() is applicable for argument types: () values: []
Possible solutions: b(), any(), is(java.lang.Object), any(groovy.lang.Closure), wait(), run()
        at groovysh_evaluate.b (groovysh_evaluate:5)
Run Code Online (Sandbox Code Playgroud)

为什么groovysh找不到方法a()?

groovy groovyshell

5
推荐指数
1
解决办法
230
查看次数

Java8中的GroovyShell:内存泄漏/重复的类[提供了src代码+负载测试]

由GroovyShell / Groovy脚本引起的内存泄漏(请参阅最后的GroovyEvaluator代码)。主要问题是(从MAT分析器复制粘贴):

由“ <系统类加载器>”加载的类“ java.beans.ThreadGroupContext”占用807,406,960(33.38%)个字节。

和:

由“ sun.misc.Launcher $ AppClassLoader @ 0x7004e9c80”加载的“ org.codehaus.groovy.reflection.ClassInfo $ ClassInfoSet $ Segment”的16个实例占用1,510,256,544(62.44%)字节

我们正在使用Groovy 2.3.11和Java8(确切地说是1.8.0_25)
升级到Groovy 2.4.6不能解决问题。只是提高了内存使用一个 一点,ESP。非堆。
我们正在使用的Java参数:-XX:+ CMSClassUnloadingEnabled -XX:+ UseConcMarkSweepGC

顺便说一句,我已阅读https://dzone.com/articles/groovyshell-and-memory-leaks。当不再需要GroovyShell shell时,我们会将其设置为null。使用GroovyShell()。parse()可能会有所帮助,但这对我们来说不是一个选择-我们有10多个集合,每个集合由20-100个脚本组成,并且可以随时更改(在运行时)。

设置MaxMetaspaceSize也应该有所帮助,但这并不能真正解决根本问题,也不能消除根本原因。所以我仍在努力确定。


我创建了负载测试来重新创建问题(请参阅最后的代码)。当我运行它时:

  • 堆大小,元空间大小和类数不断增加
  • 几分钟后进行的堆转储大于4GB

前3分钟的效果图: 在此处输入图片说明

正如我已经提到的,我正在使用MAT分析堆转储。因此,让我们检查Dominator树报告:

在此处输入图片说明

Hashmap占用了30%以上的堆。因此,让我们进一步分析它。让我们看看里面有什么。让我们检查哈希条目:

在此处输入图片说明

报告了38 830个条目。包括38780个条目,这些条目的键匹配“ .class Script。 ”。

另一件事,“重复的类”报告:

在此处输入图片说明

我们有400个条目(因为负载测试定义了400个G.script),所有这些条目都属于“ ScriptN”类。它们都持有对groovyclassloader $ innerloader的引用

我发现了类似的错误报告:https : //issues.apache.org/jira/browse/GROOVY-7498(请参阅最后的评论和屏幕截图)-通过将Java升级到1.8u51解决了他们的问题。但是,这对我们并没有招数。

我们的代码:

public class GroovyEvaluator
{
    private GroovyShell shell;

    public GroovyEvaluator()
    { …
Run Code Online (Sandbox Code Playgroud)

memory-leaks groovyshell groovyclassloader java-8

5
推荐指数
1
解决办法
2763
查看次数

groovy + shell:转义字符

我正在使用 Groovy 沙箱使用 Jenkins 管道。我正在尝试在 groovy sh 函数中运行 shell 脚本。

原来的shell脚本是

sed -i 's/sometext/'"${othertext}"'/' filename
Run Code Online (Sandbox Code Playgroud)

我正在尝试用其他文本(动态获取)替换特定文本。该脚本在直接执行时工作正常。但我想在 jenkins groovy sh 函数中使用它。

sh(script: '<above shell script>',  returnStdout:false)
Run Code Online (Sandbox Code Playgroud)

但是存在转义字符的问题。我试过这种逃避性格的方式

sh (script: '''sed -i 's/sometext/othertext/' filename''', returnStdout:false)
Run Code Online (Sandbox Code Playgroud)

它工作正常,但othertext不是动态获取的。有人可以帮我用原始脚本转义字符吗?或者请建议任何其他方式来做到这一点。

shell groovy groovyshell jenkins jenkins-pipeline

5
推荐指数
1
解决办法
6646
查看次数