java JDK 9+内置ClassLoader模块引用解析将使用类路径(而不是Jar)查找资源
我在JPMS jdk上遇到了麻烦。内部的加载器BuiltinClassLoader在IDE的上下文中执行主方法时(我使用IntelliJ 2018.1)
如果资源使用标准方法加载到模块内类中,如
MyMainClass.class.getResourceAsStream("/some-resource")
由于ModuleReference不是一个jar,而是一个类路径,因此未找到资源
[module org.ubl.scb, location=file:///home/christopher/IdeaProjects/systematik-catalogue-builder/web-anno/out/production/classes/]
nameToModule映射中的所有其他条目如下所示:
key = "logback.core"
value = "[module logback.core, location=file:///home/christopher/.m2/repository/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar]"
当然,在类中永远找不到资源,但如果位置是jar根,则可能会找到
这是虫子还是我遗漏了什么
# 1 楼答案
这是一个与IDE相关的编译器输出问题。该项目使用渐变构建。gradle构建的默认输出将创建如下目录结构:
然而,要在JPMS项目中运行测试或执行主要方法,gradle还不能工作。我使用内置的IntelliJ编译器,它生成的输出结构与gradle完全不同。默认设置如下所示:
如果发生变化,必须使用Build项目(ctrl+F9)重新生成项目,以生成此输出结构。在本例中,我假设丢失的“某些资源”尚未复制到IntelliJ输出结构中(可能是因为我还没有重建项目),因此BuiltinClassLoader不会在那里找到它。将资源复制到名为“classes”的目录(与JAR相同)可能会让人困惑,但这就是如何完成的
IDE根本不使用Gradle构建输出。。。这也会对任何必须添加到IDE设置中的
add-modules
等编译器选项产生影响,即使它们是在gradle构建脚本中指定的。 ...