4

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

Error occurred during initialization of boot layer
java.lang.LayerInstantiationException: Package images in both module A and module B

虽然我的图像文件夹并不是一个包,而只是一个包含资源的文件夹。那么如何将两个带有图像文件夹的模块放到我的模块路径中呢?

4

1 回答 1

3

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

虽然可以通过将资源放在不是有效包名称的路径下来做到这一点,例如META-INFO/resources或其他带有-连字符的路径,但我建议不要这样做,因为这些资源没有被封装,并且可能不是可通过某些 API 唯一标识。

换句话说:应用程序中的任何代码都可以加载不在有效包内的资源,而不仅仅是包含该资源的 jar 中的模块代码。

以及:如果资源没有基于其在 jar 中的路径的唯一名称,则ClassLoader.findResourceAPI 只能找到具有相同名称的资源之一。


我的建议是在你的模块中创建一个与模块同名的包,并带有.images后缀。例如mod.foo.images,然后将您的资源放入该包中。然后使用模块化资源加载 API 加载资源

MyClass.class.getModule().getResourceAsStream("mod/foo/images/my_image.jpg")

这样,资源只能由同一模块中的代码加载(mod.foo只要将其放在模块路径上),并避免资源名称有任何歧义。

于 2021-10-16T17:32:24.850 回答