Oracle的Java模块化系统保卫战

责任编辑:editor004

作者:Michael Redlich

2017-06-26 11:32:11

摘自:INFOQ

很多开发团队认为,在他们将所有代码、框架和库模块化之前就不能使用Java 9。开发人员可以在Java 9里继续使用类路径,不过因为Java 9有了模块机制,所以开发人员就不再需要类路径了。

2017年企业新兴技术(ETE)大会上最为及时的演讲之一要算由Oracle JVM负责人Karen Kinnear呈献的“Java的未来:模块化及其他”。在她演讲之前的这段时间发生了很多事情,其中最为引人瞩目的就是5月8号针对JSR 376的投票事件。

Kinnear介绍了Java 9的目标,包括提升开发者效率和改进Java云API。在对Java 9相关的JEP进行了一番评述之后,她开始专注于Java平台模块化系统(JPMS)的话题。JPMS也就是Jigsaw项目或JSR 376。

Kinnear向参会人员问了三个有关模块化的问题。

模块遗漏问题。 模块系统在构建模块图时会检测遗漏的模块。冲突问题。 在构建模块图时包的冲突问题也会被检测到。变更内部API是否安全? 模块系统可以确保无法从模块外部访问内部的API。

Kinnear说,模块可以被集成到已有的应用程序里,她还演示了包与模块之间如何进行交互,解释了模块路径和类路径之间的区别。她还向开发者介绍了如何迁移到Java 9,特别是如何在迁移过程中保持向后兼容。

Oracle Java平台组的首席架构师Mark Reinhold在2016年3月份的白皮书中描述了JPMS的目标。

可靠的配置 使用声明式的程序组件依赖机制代替脆弱且容易出错的类路径机制。强封装 组件可以声明自己的哪些公共类型是可以被其他组件访问哪些是不能被访问的。

社区的反应

Red Hat的JBoss架构副主席Scott Stark表达了他对JPMS存在的一些疑问,Red Hat认为这些问题是影响JPMS无法达成JSR提交目标的主要因素。Stark说:

Jigsaw是一个全新的模块化系统,它可以很好地应用在Java上,但并没有在生产环境里那些基于JVM的真实应用上大规模尝试应用JPMS。很多应用程序可能无法使用Jigsaw,或者需要进行重大的重构才可以。

IBM和Red Hat公开表示他们不会为当前的JPMS投赞成票。

尽管没有达成一致意见,Reinhold仍然提交了JSR 376公开预览版,并声明“这对于广大的Java生态圈来说是最有益的,我们因此可以达成切实的目标”。在投票当天,他还向执行委员会(EC)提交了一封公开信,呼吁他们能够为JSR 376投赞成票。不过,最终JSR 376仍然没能通过投票。

投票之后

我们的主要疑问在于,JPMS有可能会颠覆开发者,但却未能给他们带来直接的好处。我们担心因此会阻碍这项技术的大规模采用。我们希望JPMS能够对最初的目标做更全面的调整,从而真正地解决开发者的痛点。比如,非公开包名称冲突就与当前JSR“不互相干扰”和“强封装”的目标不一致。而如果模块能够更加彻底地分离,那么就可以通过把包隐藏在模块内部来支持相同包的多个复本同时存在。如此直观的好处简化了开发人员模块化代码的工作,也因此能够加速JPMS的采用速度。

在与InfoWorld的一次访谈中,Reinhold尝试着澄清人们对JPMS的误解。关于人们反对无法在Java中使用Maven这一问题上,Reinhold说,这不是真的,“Maven可以在Java 9里使用”。不过他承认,Maven的插件可能无法正常运行,包括Surefire测试插件。

Reinhold确认了开发者最喜欢的一些库、框架和工具可能无法在Java 9中使用,这是因为当下的一些因素造成的,不过他说在正式发布时可能可以解决这些问题。他指出,这些项目的维护者已经在使用Java 9抢先版,所以他们会为这些项目做好支持Java 9的准备。这也就是为什么一些项目已经可以使用Java 9,如Spring Boot和Hibernate Validator。

很多开发团队认为,在他们将所有代码、框架和库模块化之前就不能使用Java 9。Reinhold说这也是不对的。

开发人员可以在Java 9里继续使用类路径,不过因为Java 9有了模块机制,所以开发人员就不再需要类路径了。

伦敦Java社区共同创始人及jClarity CEO Martijn Verburg与InfoQ交流了他对JSR 376投票的看法。在谈到JVM模块化的好处时,他说:

它为Java代码提供了更多的安全性;它隐藏了很多内部API或者不应该暴露给开发人员的API;不过需要为那些被隐藏的功能提供安全的替代方案。Java的运行时将变得更小,因为运行时被拆分成更小的模块。Java 9将提供jlink工具,用于将应用程序部署在更小的运行时上,只安装必要的组件。服务器端的应用程序就不需要把客户端的GUI(如AWT何Swing)也包含在内。这样,Java可以启动得更快,可以在更小的设备上运行应用,在云端的部署也会更快。

IBM的高级技术研究员Tim Ellison最近表达了他对如何在JSR 376上达成共识的看法。他说:

我们希望看到修订过的规范重新呈现给JCP执行委员会,也希望执行委员会能够支持专家组的结论。IBM关心的是企业应用在迁移到Java 9时的兼容性问题。升级到Java 9对迁移有重大的影响,而JPMS的默认行为在这方面会提供很大的帮助。

JSR 376即将进入到终稿阶段。在定稿之前可能还有一些小幅度的改动,不过整个过程充分展示了JCP致力于为Java提供更加强大的语言特性。感谢Oracle一直在主导这个规范,以及专家组在这个里程碑上所投入的大量精力。

Reinhold最近针对Java 9的GA版本发布日期提出了一个新的提议。他说:

为了迎接各种可能的结果,我建议保持6月22号的JDK 9初始候选版本发布日期不变,不过将GA版本的发布日期向后延期,为通过JCP流程争取更多的时间。我提议将GA版本的发布日期向后延期8周,从7月27号调整为9月21号。

JSR 376的下一个投票日期是周一,也就是2017年6月26号。

参考资料

OSGi and Java 9 Modules Working Together by Neil Bartlett (November 13, 2015)Java 9, OSGi and the Future of Modularity (Part 1) by InfoQ (September 22, 2016)Java 9, OSGi and the Future of Modularity (Part 2) by InfoQ (October 4, 2016)Concerns Regarding Jigsaw (JSR 376, Java Platform Module System) by Scott Stark (April 14, 2017)IBM and Red Hat to Vote “No” on Java Modules (Jigsaw) by InfoQ (May 1, 2017)Mark Reinhold Confirms JPMS (Jigsaw) will be Submitted for Public Review, Despite Community Concernsby InfoQ (May 4, 2017)Twitter’s Vote on JSR 376 (Java Platform Module System) by Tony Printezis (May 10, 2017)Oracle’s Java Chief Debunks ‘Misconceptions’ about Java 9 by Paul Krill (May 17, 2017)Martijn Verburg on the JCP EC “No” Vote for the Java Platform Module System by InfoQ (May 19, 2017)Building Consensus on JSR 376 by Tim Ellison (May 26, 2017)Proposed Schedule Change for JDK 9 by Mark Reinhold (May 30, 2017)

编辑后记

Michael Redlich是ETE的积极参与者,他从2008年开始作为ETE的参会者和演讲者,2013年成为ETE指导委员会的成员。

查看英文原文:Oracle Defends the Java Module System

链接已复制,快去分享吧

企业网版权所有©2010-2025 京ICP备09108050号-6京公网安备 11010502049343号