Java Beans Introspector 需要桌面模块

Java Beans Introspector requires desktop module

我正在研究使用 Jigsaw 来减少微服务的足迹。我必须找到的最后一个依赖项是 java.beans.Introspector.

想象一下当我发现我需要引入整个模块 java.desktop 时我的惊讶,其中包含各种不相关的东西,如 awt、applet、swing 等。

这对我来说似乎很疯狂,bean 内省肯定应该是基本语言的一部分,并且与 UI 功能无关。我认为依赖来自 Spring Boot 的嵌入式 Tomcat,所以我不能自己修改它。

问题:模块是您可以访问的最精细的粒度,还是有另一种方法来 trim 脂肪。

依赖关系存在,因为 BeanInfoSimpleBeanInfo 从 AWT 包中引用了 IconImage。此外,PropertyEditor 声明方法 getCustomEditorpaintValue​ 创建对 类 ComponentGraphicsRectangle 的依赖关系。还有一些 类 在 API 中不可见,它们引用了桌面 类,即为这些桌面 类 提供的默认 属性 编辑器和持久性委托实现.

由于 Java 模块不允许包分布在多个模块中,因此无法将功能拆分为 AWT 依赖模块和非依赖模块(以向后兼容的方式)。动态加载的工件,即实际的 bean 信息、编辑器和持久性委托,可以移到另一个模块中,但不能移到 BeanInfoPropertyEditor 接口及其 SimpleBeanInfoPropertyEditorSupport 实施。

没有更好的粒度,也没有解决方案可以在不创建该依赖项的情况下使用 bean 类。 JDK 开发人员如何处理由该决定引起的问题可以很好地说明这一点。由于 java.util.logging.LogManagerjava.util.jar.Pack200.Packer/Unpacker 支持 java.beans.PropertyChangeListener,这导致对 java.desktop 的依赖,如果保持这种方式,这些方法是有史以来第一个方法从标准 Java API 中删除,速度与首次在 Java 8 中弃用并已在 Java 9 中删除一样快。

我认为,如果有一种方法可以像 PropertyChangeListener 那样声明对基本 bean 类 的依赖,而不会对 java.desktop 产生不必要的依赖,那么 JDK开发人员没有开创先例。