是否可以自动将用户类预加载到groovy解释器中?

时间:2010-06-27 23:14:17

标签: groovy

有没有办法在groovy解释器中自动加载用户类,System.out自动加载的方式(所以你不必导入System.out来使用println)?我希望能够编写使用自定义类的脚本并在groovy解释器中运行脚本,而无需始终导入所有类。

2 个答案:

答案 0 :(得分:2)

是的,你只需要创建一个profile / rc文件。只需在〜/ .groovy / groovysh.profile创建一个文件,然后将导入文件放在那里。您还需要确保要包含的任何其他类都是CLASSPATH的一部分。

ex:〜/ .groovy / groovysh.profile:

import org.apache.commons.lang.StringUtils

println "in groovysh.profile"

然后运行groovysh并使用StringUtils中的方法:

% groovysh
in groovysh.profile
Groovy Shell (1.7.3, JVM: 1.6.0_20)
Type 'help' or '\h' for help.
---------------------------------------------------------------------------------------------------------------------------------
groovy:000> StringUtils.isWhitespace("    ")
===> true
groovy:000> 

你可以看到导入到位了(并且它还打印出我在配置文件中的println。这个例子只有在你的类路径中有commons-lang jar文件时才有效。

有关详细信息,请参阅the Groovy Shell页面。

答案 1 :(得分:0)

Groovy向Object添加了一些方法,包括您在printWriters上期望的printlnprintf等方法。它们隐式使用System.out。如果感觉System.out是全局可用的话,这实际上是多么的groovy。

如果你想默认导入一组类,那么可以在不指定完整包名的情况下使用它们,Ted关于groovysh.profile的评论适用。

但是,如果您希望特定对象(如System.out)全局可用,那么可以在不引用对象的情况下调用其方法,则可以向Object添加一些动态方法。例如,要使全局JDK记录器的日志记录方法全局可用:

Object.metaClass.info = { String message ->
    java.util.logging.Logger.global.info(message)
}
Object.metaClass.warning = { String message ->
    java.util.logging.Logger.global.warning(message)
}
Object.metaClass.severe = { String message ->
    java.util.logging.Logger.global.severe(message)
}
etc...

将这些方法应用于基础对象metaClass后,任何对象都可以调用info("message")并将其记录下来,从而有效地使Logger.global以与System.out相同的方式可用。