Jigsaw 终于添加到 JDK 9 中了

  • Alex Blewitt
  • 张卫滨

2016 年 3 月 15 日

话题:Java语言 & 开发

发往 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.langjava.util以及java.time等)。这种划分会带来一定的破坏性,java.beans 包因为它与 AWT 和 Applets 的密切关联,被转移到了java.desktop模块中,这就意味着在 java.base 包中,为PropertyChangeListener实现监听器注册的类被移除掉了。

为了保证 JDK 9 和 Jigsaw 的开发不会遇到太多的困难,Jigsaw 实现是位于它自己的 forest 之中的。这样的话,通过OracleAzul 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 事宜的进展。

查看英文原文:Jigsaw Finally Arrives in JDK 9

Java语言 & 开发