java - 如何将资源添加到同名文件夹中的两个模块化 jar 中?

标签 java java-9 java-platform-module-system java-17

假设我们有两个带有两个不同模块的 jar 文件。两个 jar 文件都在其 jar 中名为图像的文件夹中包含一些资源(比如 png 文件)。当我现在尝试在 Java 中启动模块时,出现以下错误:

Error occurred during initialization of boot layer
java.lang.LayerInstantiationException: Package images in both module A and module B
虽然我的图像文件夹并不是一个包,而只是一个包含资源的文件夹。那么如何将两个带有图像文件夹的模块放到我的模块路径上呢?

最佳答案

How to add resources to two modular jars in same-named folders?


虽然可以通过将资源放在不是有效包名称的路径下来做到这一点,例如 META-INFO/resources或其他带有 - 的路径中的连字符,我建议不要这样做,因为此类资源未封装,并且可能无法通过某些 API 唯一识别。
换句话说:应用程序中的任何代码都可以加载不在有效包内的资源,而不仅仅是包含该资源的 jar 中的模块代码。
以及:如果资源没有基于其在 jar 中的路径的唯一名称,则 ClassLoader.findResource 只能找到具有相同名称的资源之一。应用程序接口(interface)。

我的建议是在你的模块中创建一个与模块同名的包,使用 .images后缀。例如mod.foo.images ,然后将您的资源放入该包中。然后使用 modular resource loading API 加载资源:
MyClass.class.getModule().getResourceAsStream("mod/foo/images/my_image.jpg")
这样,资源只能由同一模块中的代码加载( mod.foo ,只要你把它放在模块路径上),并避免资源名称的任何歧义。

关于java - 如何将资源添加到同名文件夹中的两个模块化 jar 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69526033/

相关文章:

java - Java Audio SourceDataLine不支持PCM_FLOAT

java - 通过枚举实现的单例在模块化趋势中仍然值得(即 Java 9+ 模块化和 Jigsaw 项目)

java - Java 9 中的 --add-exports 和 --add-opens 有什么区别?

java - 如何使用java api监控master、regionserver和zookeeper的工作

java - 使用 BigInteger

java - javafx 中是否有任意形状的 "fill"函数?

xml - 在模块路径或类路径上未找到 JAXB-API 的 javax.xml.bind.JAXBException 实现

java - 如何运行 JShell 文件?

java - 从 Java 9 向进程发送信号

maven - Jigsaw 项目与 Maven