有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    这是一个与IDE相关的编译器输出问题。该项目使用渐变构建。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项目(ctrl+F9)重新生成项目,以生成此输出结构。在本例中,我假设丢失的“某些资源”尚未复制到IntelliJ输出结构中(可能是因为我还没有重建项目),因此BuiltinClassLoader不会在那里找到它。将资源复制到名为“classes”的目录(与JAR相同)可能会让人困惑,但这就是如何完成的

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