SystemClassLoader的Groovy脚本类路径问题

时间:2012-03-30 07:56:15

标签: groovy classpath classloader

我正在编写一个Groovy脚本,该脚本使用我无法更改的第三方java代码。 此代码使用(严重的,我认为)ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") 并期望阅读文件。

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

时,Java的一切顺利

但是,第三方代码现在要与我们已编写的一堆Groovy代码集成,因此我们希望从groovy运行它。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以尝试在运行脚本时将jar添加到系统类加载器中,如下所示:

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

PS:我认为你的意思是ClassLoader.getSystemClassLoader(),而不是System.getSystemClassLoader()

答案 1 :(得分:0)

您可以尝试将jar放入%GROOVY_HOME%\lib文件夹,或者在groovy命令周围创建一个包装器,然后在开始Groovy过程之前修改%CLASSPATH%变量。