我们可以发现,这里其实是通过java启动了org.codehaus.groovy.tools.GroovyStarter,然后把“--main groovy.ui.GroovyMain”作为参数传给GroovyStarter,最后又把SomeScript作为参数传给GroovyMain。注意,这里只把$GROOVY_HOME/lib/groovy-2.1.3.jar作为classpath参数传给了JVM,而不包含Groovy依赖的第三方jar包。
我们来看一下GroovyStarter的源代码(其中省略了异常处理的代码):
public static void rootLoader(String args[]) {
String conf = System.getProperty("groovy.starter.conf",null);
LoaderConfiguration lc = new LoaderConfiguration();
// 这里省略了解析命令行参数的代码
// load configuration file
if (conf!=null) {
lc.configure(new FileInputStream(conf));
}
// create loader and execute main class
ClassLoader loader = new RootLoader(lc);
Class c = loader.loadClass(lc.getMainClass()); // 使用RootLoader载入GroovyMain
Method m = c.getMethod("main", new Class[]{String[].class});
m.invoke(null, new Object[]{newArgs}); // 调用GroovyMain的main方法
}
//
public static void main(String args[]) {
rootLoader(args);
}
这里的LoaderConfiguration是用来做什么的呢?它是用来解析$GROOVY_HOME/conf/groovy-starter.conf文件的,该文件内容如下(去掉了注释部分):
load !{groovy.home}/lib/*.jar
load !{user.home}/.groovy/lib/*.jar
load ${tools.jar}
这表示,将$GROOVY_HOME/lib/*.jar、$HOME/.groovy/lib/*.jar以及tools.jar加入到RootLoader的classpath中,可以看出,这里包含了Groovy依赖的第三方jar包。
接下来,我们来看一下GroovyMain的源代码。GroovyMain的main函数进去之后,最终会到达processOnce方法: