Jigsaw终于添加到JDK 9中了
在发往jdk9-dev邮件列表的一封邮件中,Alan Bateman宣布Jigsaw模块系统的一个快照版本将会合并到JDK9开发分支的主线中。模块系统的状态文档最近进行了更新来表明它的进展,这是从Jigsaw项目启动以来,它的变更第一次合并回来。
在历史上,Java的开发在不同的分支下进行,因为它们是Mercurial工具下不同的tree。Hotspot编译器(以及底层的VM内容)是在Hotspot tree中开发的,而Java开发的主线是在jdk tree中完成的。在Open JDK的集合中,还有不同的tree用于nashorn甚至corba。这样造成的结果就是,每个分组就被称为forest,因为它们是相互关联的tree。(这种结构很大程度上是因为在创建项目的时候,Mercurial没有轻量级的分支功能,并且它没有很好的跨分支push的功能,所以它们都被分割为不同的repository,这也是为什么会有jdk8和jdk8u forest的原因,jdk8实际上是主开发分支,而jdk8u包含了其他repository的fork,而且带上了特定的标签,如8u40和8u60。幸好,所有的这些内容能够全部放到一个Git repository之中,这其实是非常有价值的。)
Jigsaw所引入的变化是很明显的,底层的包被划分成了不同的模块,每个模块包含一个或多个包。java.base模块包含了标准库的主要内容(java.lang、java.util以及java.time等)。这种划分会带来一定的破坏性,java.beans包因为它与AWT和Applets的密切关联,被转移到了java.desktop模块中,这就意味着在java.base包中,为PropertyChangeListener实现监听器注册的类被移除掉了。
为了保证JDK 9和Jigsaw的开发不会遇到太多的困难,Jigsaw实现是位于它自己的forest之中的。这样的话,通过Oracle和Azul Zulu得到的主线OpenJDK Java构建版本是不包含Jigsaw的,开发人员也无法进行尝试。而我们可以得到一个特殊的“早期可访问”(early access)构建版本,这个版本提供了Jigsaw的内容,但是并不包含JDK 9分支的一些其他变更。
所以,这封邮件确认Oracle将会尝试将并行开发的Jigsaw forest 合 并 到 JDK9 forest 之 中。一 些 重 要 的 变 更(如 移 除PropertyChangeListeners)已经完成了,自动化的差异对比显示没有其他的功能移除了,不过包含了几百项对API的添加/变更。为了尽可能减少额外出现的问题,JDK9 forest将会锁定两周的时间,以便于将Jigsaw相关的变更合并到主线的JDK9 forest中。预期将会只有一个构建版本——也就是3月21日的JDK9+111——不过,Jigsaw团队也申请预留了3月27日的JDK9+112构建版本,以应对Jigsaw可能出现的变化。
Jigsaw模块后续的变更将会继续在Jigsaw forest中进行,因此针对JDK9主线的开发人员将不会处理由此导致的不稳定。但是,这个构建版本是第一次把Java的基础库划分为不同的模块,并且会在一个能够感知模块的系统中进行编译,因此希望能够避免将来在模块间添加功能所导致的问题。同时,Jigsaw forest未来将会完全合并到 JDK9中,它本身会被移除,不过这可能需要等到年底才会进行。
在合并之前,已经进行了一些评估,InfoQ将会持续关注模块系统和Jigsaw合并到JDK9事宜的进展。