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

Java 在IntelliJ中从类路径之外的JAR加载资源文件,java,intellij-idea,resources,classpath,classloader,Java,Intellij Idea,Resources,Classpath,Classloader,假设在IntelliJ中开发的应用程序被打包在一个JAR中,并使用 可以位于任何包中(不仅位于资源文件夹中) 可能具有非标准文件扩展名(甚至可能是Java文件) 不存在于所有类路径中(例如,为了避免循环依赖) 如果给包(比如,com.example.pack)中的类(比如,MyClass)一个指向此类“资源”的路径,该“资源”位于其类路径之外,并试图通过 MyClass.class.getClassloader().getResourceAsStream(resourcePath); 由

假设在
IntelliJ
中开发的应用程序被打包在一个JAR中,并使用

  • 可以位于任何包中(不仅位于
    资源
    文件夹中)
  • 可能具有非标准文件扩展名(甚至可能是Java文件)
  • 不存在于所有类路径中(例如,为了避免循环依赖)
如果给包(比如,
com.example.pack
)中的类(比如,
MyClass
)一个指向此类“资源”的路径,该“资源”位于其类路径之外,并试图通过

 MyClass.class.getClassloader().getResourceAsStream(resourcePath);
由于类路径,在
IntelliJ
单元测试中返回的
InputStream
对象(预期)为
null
。然而,当代码被执行时,它会工作,因为所有东西都在同一个JAR中

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

java -cp MyApplication.jar com.example.pack.MyClass
从命令行生成一个非
null
InputStream


有没有办法将
IntelliJ
配置为以某种方式“知道”所有包都属于相同的
JAR
,从而对它们进行相应的处理,以便上面对
getResourceAsStream()的调用
有效?

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

这不包括已经依赖于其他模块的模块,从而导致循环依赖。否则,答案是正确的。感谢和+1。IntelliJ项目结构确实支持循环依赖关系,因此这本身不是问题。