从IntelliJ中的类路径外的JAR加载资源文件

时间:2016-02-17 00:36:13

标签: java intellij-idea resources classpath classloader

假设在IntelliJ中开发的应用程序打包在单个JAR中并使用“资源”文件

  • 可以位于任何包中(不仅位于resources文件夹中)
  • 可能有非标准文件扩展名(甚至可能是Java文件)
  • 不存在于所有类路径中(例如,为了避免循环依赖)

如果一个包(比如MyClass)中的一个类(例如,com.example.pack)被赋予了一个路径,这个“资源”位于其类路径之外,并试图通过

 MyClass.class.getClassloader().getResourceAsStream(resourcePath);

由于类路径,InputStream单元测试中返回的IntelliJ对象(预期)null。但是,当代码执行时,它可以工作,因为所有内容都在同一个JAR中。

例如,将应用程序的所有包捆绑在同一个JAR中(例如,MyApplication.jar)并运行类似

的内容
java -cp MyApplication.jar com.example.pack.MyClass

从命令行生成非null InputStream

有没有办法让IntelliJ以某种方式“知道”所有包都属于同一个JAR并因此对其进行相应处理,以便上述对getResourceAsStream()的调用有效?

1 个答案:

答案 0 :(得分:1)

配置的唯一方法是将包含资源文件的模块作为依赖项添加到包含测试的模块中。然后IntelliJ IDEA将该模块包含在测试的运行时类路径中,getResourceAsStream()调用将起作用。