- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 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/
这个问题在这里已经有了答案: Scanning classpath/modulepath in runtime in Java 9 (2 个答案) 关闭 4 年前。 更新:我在这里回答了我自己的问题
使用代码: ModuleFinder.of(Paths.get(path)).findAll() 我能够检索到 Set path 中的所有.jars文件夹。 我的下一步是获得 Module来自 Mod
我在 JPMS jdk.internal.loader 方面遇到了障碍。 BuiltinClassLoader在 IDE 上下文中执行主要方法时(我使用 IntelliJ 2018.1)。 如果使用标
我是一名优秀的程序员,十分优秀!