我正在编写一个Groovy脚本,该脚本使用我无法更改的第三方java代码。
此代码使用(严重的,我认为)ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file")
并期望阅读文件。
使用java -cp "/path/to/jar/file" ...
但是,第三方代码现在要与我们已编写的一堆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
以返回上下文类加载器)?
答案 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%
变量。