gpt4 book ai didi

java - JDK 9+ 内置类加载器 ModuleReference 解析将使用类路径(而不是 Jar)来查找资源

转载 作者:太空宇宙 更新时间:2023-11-04 10:34:02 24 4
gpt4 key购买 nike

我在 JPMS jdk.internal.loader 方面遇到了障碍。 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 根目录,则可能会找到。

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

最佳答案

这是一个与 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

如果发生变化,必须使用“构建项目”(ctrl + F9) 重建项目才能生成此输出结构。在这种情况下,我认为缺少的“some-resource”尚未复制到 IntelliJ 输出结构中(可能是因为我还没有重建项目),因此内置类加载器不会在那里找到它。也许令人困惑的是,资源被复制到名为“classes”的目录(与 JAR 相同)中,但这就是它的完成方式。

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

关于java - JDK 9+ 内置类加载器 ModuleReference 解析将使用类路径(而不是 Jar)来查找资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49674206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com