我可以从 Java 模块中排除 Maven 资源文件夹吗?

问题描述 投票:0回答:1

我创建了两个 Maven 项目“javafx”和“commonfx”来重现错误。

module commonfx {
   exports commonfx.calculator;
   requires useraccess;
   requires usercore;
}

module javafx {
       requires javafx.controls;
       requires javafx.graphics;
       requires javafx.fxml;
       requires commonfx;
       opens org.example to javafx.graphics, javafx.fxml;
}

两个项目都有一个资源文件夹。他们不导出这些文件夹,但无论如何我不断收到错误消息:

引导层初始化时发生错误

java.lang.LayerInstantiationException:两个模块中的包捆绑 javafx 和 commonfx 模块

每当我重新运行应用程序时,我都会收到一条新的错误消息。但每次资源文件夹在两个模块中都具有相同的名称。

引导层初始化时发生错误

java.lang.LayerInstantiationException:在两个模块中打包图像 commonfx 和 javafx 模块

引导层初始化时发生错误

java.lang.LayerInstantiationException:包main.resources.images 在 commonfx 模块和 javafx 模块中。

所用技术:

  • Java 21
  • JavaFX SDK 21
  • 适用于企业 Java 和 Web 开发人员的 Eclipse IDE 版本:2024-03
  • Maven 3.9.6

maven 资源文件夹是否有可能被忽略?

java eclipse maven javafx java-module
1个回答
0
投票

TL;DR: 使用唯一的包名称,即使未导出包。


您似乎认为

bundle
config
images
不被视为软件包。这不是真的。包不必包含类文件才能被视为包。请注意,类文件本身基本上是一种特殊类型的资源。从
ClassLoader
的角度来看,类路径/模块路径上的类文件和资源的查找和打开方式完全相同。此外,由于
bundle
config
images
都是有效的包名称,因此其中包含的资源是 封装的(基于包的功能)。

至于

bundle
images
都没有被导出,不幸的是,这在这种情况下是无关紧要的。模块系统不允许所谓的拆分包。或者更准确地说,如果发生以下情况,解决方案将失败:

  • 两个或多个模块将同名的包导出到“读取”这两个模块的模块。这包括包含包 p 的模块 M “读取”另一个将 p 导出到 M 的模块的情况。

-

java.lang.module
软件包文档

现在,这似乎表明非出口包不受此要求的约束。它们是,只要包含非导出包的两个模块映射到不同的类加载器。您可以通过手动将两个模块定义为“具有“许多加载器”的模块层”来测试这一点,并查看解决方案是否成功。但在您的情况下,您的两个模块被映射到相同的类加载器(系统/应用程序类加载器),因此尽管未导出拆分包,但解析失败。这种限制似乎更多的是实现细节而不是明确定义的行为;请参阅Java 9 重叠非导出包以获取更多信息和一些讨论的链接。 解决方案是使用唯一的包名称。按照惯例,这涉及使用反向域名和标识工件的名称,这两者通常都是从所述工件的 Maven 坐标中提取的。确定模块名称时也可以这样做。也就是说,一个简单而快速的解决方法是为拆分包添加模块名称前缀。

© www.soinside.com 2019 - 2024. All rights reserved.