【发布时间】:2012-04-13 21:45:37
【问题描述】:
我正在编写一个 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 中的类而不开始尝试一些肮脏的 hack(例如元类化 getSystemClassloader 以返回上下文类加载器)?
【问题讨论】:
标签: groovy classpath classloader