【问题标题】:Groovy script classpath issue with SystemClassLoaderSystemClassLoader 的 Groovy 脚本类路径问题
【发布时间】: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


    【解决方案1】:

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

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

    PS:我假设您的问题是ClassLoader.getSystemClassLoader(),而不是System.getSystemClassLoader()

    【讨论】:

      【解决方案2】:

      您可以尝试将您的 jar 放入 %GROOVY_HOME%\lib 文件夹或围绕您的 groovy 命令制作一个包装器,并在开始您的 Groovy 进程之前修改 %CLASSPATH% 变量。

      【讨论】:

      • 感谢您的回答 %GROOVY_HOME%\lib => 已尝试,但已由 GroovyClassLoader 加载 %CLASSPATH% => 已被 Groovy 作为 -cp 选项选择
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多