我是一个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) 我添加了使用 GroovyShell 在我的 Java 应用程序中解析和评估 groovy 脚本的功能。哪个 Maven 工件是我的构建中包含的最低限度?
我知道 groovy-all 肯定会包含我需要的一切,但我猜我也可以使用一个更小的包?
我不得不问这个问题感觉很荒谬,但我似乎无法将多个 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 …
我正在一个项目中,我希望用户在Groovysh上尝试Java类。我想为他们提供方便,并希望在groovysh启动时默认导入某些软件包,这样用户每次启动shell时都不必重新键入相同的导入。有谁知道如何做到这一点?
在此先感谢,伊戈尔
我正在使用 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) 以下是2行代码:
def name = "Neo"
println name
Run Code Online (Sandbox Code Playgroud)
如果我执行它groovysh,我会得到Unknown property: name错误.如果我执行它groovyConsole,一切都很顺利.
我在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) 我将以下脚本加载到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()?
由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也应该有所帮助,但这并不能真正解决根本问题,也不能消除根本原因。所以我仍在努力确定。
我创建了负载测试来重新创建问题(请参阅最后的代码)。当我运行它时:
正如我已经提到的,我正在使用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) 我正在使用 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不是动态获取的。有人可以帮我用原始脚本转义字符吗?或者请建议任何其他方式来做到这一点。
groovyshell ×10
groovy ×9
dsl ×1
grails ×1
inheritance ×1
jar ×1
java ×1
java-8 ×1
jenkins ×1
memory-leaks ×1
shell ×1