0

我遇到了 JPMS jdk.internal.loader 的障碍。在我的 IDE 上下文中执行主要方法时的 BuiltinClassLoader(我使用 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 根目录,则可能是这样。

这是一个错误还是我错过了什么?

4

1 回答 1

0

这是与 IDE 相关的编译器输出问题。该项目使用 gradle 构建。gradle 构建的默认输出将创建如下目录结构:

build
 -classes
   -java
      -main
       module-info.class  
 -libs
 -resources

但是,要在 JPMS 项目中运行测试或执行主要方法,gradle (还)不起作用。我使用内置的 IntelliJ 编译器,它生成与 gradle 完全不同的输出结构。默认如下所示:

out
  -production
    -classes
       -some/package/name
       some-resource
       module-info.class

如果发生变化,必须使用 Build Project (ctrl + F9) 重建项目以生成此输出结构。在这种情况下,我认为缺少的“一些资源”尚未复制到 IntelliJ 输出结构中(可能是因为我还没有重建项目),所以 BuiltinClassLoader 不会在那里找到它。将资源复制到名为“classes”的目录(与 JAR 相同)中可能会令人困惑,但这就是它的完成方式。

IDE 根本不使用 Gradle 构建输出......这也会对--add-modules必须添加到 IDE 设置中的任何编译器选项产生影响,即使它们是在 gradle 构建脚本中指定的。...

于 2018-04-06T04:00:01.893 回答