Groovy的ClassLoader体系(2)

我们可以发现,这里其实是通过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(nullnew 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方法:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e291e3c156fa90d067c9dc6fbda7c069.html