2012-03-30 286 views
2

我在写一个Groovy脚本,它使用了第三方Java代码,我无法更改。 此代码使用(很糟糕,我认为)ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") 并期望读取文件。Groovy脚本类路径与SystemClassLoader问题

一切使用时java -cp "/path/to/jar/file" ...

不过,现在的第三方代码是用一堆我们已经编写Groovy代码进行整合,所以我们想从常规运行它从Java顺利。

因此,我们编写了一个Groovy脚本,让它调用test.groovy,并将其作为groovy -cp "/path/to/jar/file" test.groovy运行。

问题是,代码无法访问文件资源,因为它似乎Groovy不直接加载它在System ClassLoader中的罐子。

为了证明,在Groovy脚本中使用Thread.currentThread().getContextClassLoader().getResourceAsStream("/hard/file/path/in/jar/file"),我可以读取该文件,但是使用ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file"),我不能。

那么,有没有人知道如何从Groovy脚本加载系统类加载器中的类,而不开始尝试一些肮脏的黑客(如元类getSystemClassloader返回上下文类加载器)?

回答

1

你可以尝试添加的jar到系统类加载器,以及当你的脚本运行,像这样:

ClassLoader.systemClassLoader.addURL new File('/path/to/jar/file').toURI().toURL() 

PS:我假设你在你的问题意味着ClassLoader.getSystemClassLoader(),而不是System.getSystemClassLoader()

0

在开始Groovy过程之前,您可以尝试将jar放入%GROOVY_HOME%\lib文件夹或在groovy命令周围打包并修改%CLASSPATH%变量。

+0

感谢您的回答 %GROOVY_HOME%\ lib =>已经尝试过,但由Groovy加载GroovyClassLoader %CLASSPATH%=>由Groovy选为'-cp'选项 – Grooveek 2012-03-30 09:15:23