我正在调查使用Jigsaw来减少微服务的占用空间。我必须找到的最后一个依赖项是java.beans.Introspector。
想象一下,当我发现我需要引入整个模块java.desktop时,我会感到惊讶,它包含各种不相关的东西,比如awt,applets,swing等。
这对我来说似乎很疯狂,当然,bean内省应该是基本语言的一部分,与UI功能无关。我认为依赖来自Spring Boot的嵌入式Tomcat,所以我不能自己修改它。
问题:模块是您可以访问的最精细的粒度还是有另一种方法来修剪脂肪。
答案 0 :(得分:5)
依赖项存在,因为BeanInfo
和SimpleBeanInfo
引用了AWT包中的Icon
和Image
。此外,API中有一些类不可见,它们引用了桌面类,即为这些桌面类提供的默认属性编辑器和持久性委托实现。
由于Java模块不允许将包分布在多个模块中,因此无法将功能拆分为AWT相关模块和非相关模块(以向后兼容的方式)。动态加载的工件,即实际的bean信息,编辑器和持久性委托,可能已被移动到另一个模块,但不是BeanInfo
接口及其SimpleBeanInfo
实现。
没有创建该依赖项,没有更精细的粒度和使用bean类的解决方案。 JDK开发人员如何处理由此决定引起的问题,可以很好地说明这一点。由于java.util.logging.LogManager
和java.util.jar.Pack200.Packer
/ Unpacker
支持java.beans.PropertyChangeListener
,导致对java.desktop
的依赖,如果保持这种方式,这些方法是第一种方法从标准Java API中删除,与第一次在Java 8中弃用并在Java 9中已被删除一样快。
我认为,如果有一种方法可以声明对PropertyChangeListener
等基本bean类的依赖,而不会创建对java.desktop
的不需要的依赖,那么JDK开发人员就没有设置这个先例。