QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Jigsaw 项目另起炉灶

  • 2013-09-02
  • 本文字数:1925 字

    阅读完需:约 6 分钟

Mark Reinhold 在 jigsaw-dev 邮件列表上发言表示,Jigsaw 项目将在一个新的 Hg 仓库上另起炉灶,再次尝试解决让 JDK 实现模块化的难题。新仓库位于 http://hg.openjdk.java.net/jigsaw/jake

Jigsaw 项目迁延日久,向前可追溯到最初的 JSR 277 和和稍晚的 JSR 294 ,原本设定的目标是将 Java 的核心运行时库解耦,拆分为若干模块。如果成功实现的话,纯服务器端的 JVM 运行的时候将终于可以不必带着用不上的 AWT 支持。

对 JDK 进行模块化拆分,这件事情很不简单。例如按照现在的设计,java.beansjava.appletjava.awt包之间依次存在依赖关系。即使我们真的能够在那么多年后推翻原来的设计决策,取消它们的依赖关系,也很难不顾此失彼。

Java 其实老早就有一个模块系统,起初叫做 JSR 8 ,也就是现在的 OSGi 和 JSR 291 。这个系统被所有的主流 Java EE 应用所采用,在其他领域的系统和应用中也运用得非常广泛(如 JIRA、Eclipse),还进入了某些特定的垂直市场(如嵌入式系统、家庭自动化)。在这样的背景下,Jigsaw 项目学习java.util.Date、Java IO NIO NIO2 NIO2.2、java.logging包等前辈的榜样,丢开最佳实践,存心凑合一套给 JDK 自己用的系统。(好在 Java 8 总算收拾了java.util.Date这个怪胎,纳入了 Joda-Time,也就是新的 java.time 包来作为对java.util.Date的修正的修正。)

每一回 JSR 277/Jigsaw 推倒重来,目标都要打一点折扣。最早的时候,它是一个适用于任何应用的通用模块系统,且具备解析链和仓库存储机制。(照 Java 的惯例,系统会设计成可插拔的,我们会见到 ModuleFactory 和 ModuleResolverFactory。)差不多 5 年前的 2008 年 12 月,JSR 277 好像走进了死胡同。于是项目的目标经过重新评估,一种可以聚合多个包,但只对外暴露单一个包或单一组 API 的“超级包”概念被提了出来,从而诞生了 JSR 294。

到了 JSR 294 也徘徊不前的时候,又诞生了 Jigsaw 项目,目标相应地变更为实现一个主要为 JVM 本身服务的模块系统(但同时为用于其他系统留有余地)。Jigsaw 放弃了一些理所当然的特性,如模块解析链,只定位在给 Java 提供基本的模块定义能力。Jigsaw 提出的方案犯了一个关键错误,它让模块通过执行代码的方式,而非声明式的方式来表达依赖关系,其结果造成我们不可能通过静态分析来确定一个模块系统成立与否。(不能静态检查约束条件是否满足的模块系统,有一个现成的例子,也就是我们熟悉的“classpath”,现在通常可以在小规模的应用和一些 IDE 中见到。)

大约 1 年前,Mark Reinhold 撰文“ Project Jigsaw: Late for the Train ”,宣布 Jigsaw 项目将错过 Java 8 的发布日程。这件事情的反响毁誉参半,OSGi 的支持者和反对者们各自宣告胜利或失败;Jigsaw 推迟到 Java 9 才定案,好歹让该项目有机会修正一些错误决策。

这一次另起炉灶,Mark Reinhold 希望拿出一个不那么雄心勃勃的系统原型,一方面保留现有的由解析代理来提供各种 JAR 的方式,另一方面新增一种静态描述元素间模块依赖关系的手段。眼下新仓库中的代码仅仅是从 JDK8 拷贝过来的一个分支,但按照打算,这次会抛弃那些一直以来拖后腿的包袱,在上一轮尝试中成为问题根源的一些设计决策,将得到重新审视。

我们的计划之一,是避免像当前原型那样引入专门的“模块模式”(此模式与一些由来已久的习惯做法向左,会导致某些不普遍、但有深刻影响的兼容问题),也不负责解析依赖关系(因为这件事情 Maven、Ivy、Gradle 等构建工具已经做得够好了),在这样的前提下验证可行的方案。 我们的新原型会从旧的原型中借鉴合理的代码,但最重要的还是借机重估原来的一些设计决策,并且做一次全面的清理。

尚待决断的重要设计决策有:

  • 版本号是遵守一种现成的版本号格式系统,如 Semantic Versioning ,还是编到哪算哪
  • 模块系统是(像 Ivy、Maven 和 Gradle 那样)声明式地表述依赖关系,还是必须通过执行代码来确定依赖关系(并因此阻碍静态分析和事先核验)
  • 模块系统是(像 OSGi 那样)动态的,还是(像 Maven 那样)静态的;换言之,模块可以随增随减,还是只进不出
  • 赖关系的元数据是放在 JVM 能理解的.class 文件里,还是用 JSON、YAML、Manifest.MF 之类的文本格式来保存

以 Oracle 对外来方案的排斥,选择 OSGi 作为 Jigsaw 实现基础的可能性很低。另一方面,OSGi 作为一种完全动态的方案,用作 JVM 的模块化机制也显得过火。最好的折中方案可能是一种近似于 OSGi,具有版本化的依赖项管理和 bundle 机制,但去除动态特征(及因此导致的多重 classloader)的系统。用 Java 来实现类似系统的可能性,已经在 pojosr 项目中得到证明,我们也许会见到一个皆大欢喜的结果。

InfoQ 将持续密切注意 Jigsaw 项目重启的情况,并跟进报道其最新进展。

查看英文原文: Jigsaw, Second Cut

2013-09-02 12:382756
用户头像

发布了 225 篇内容, 共 65.4 次阅读, 收获喜欢 50 次。

关注

评论

发布
暂无评论
发现更多内容

win版Master PDF Editor(PDF编辑器) v5.9.84便携版

iMac小白

掌握SonarQube代码分析技术体系与学习路线

测吧(北京)科技有限公司

测试

Topaz Video AI 破解版下载 AI视频无损放大软件 Mac&win

Rose

【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004

YashanDB

数据库 yashandb 崖山数据库

事业-最佳实践-个人-效率提升

南山

研发效能 工作效率 研发效率

【YashanDB知识库】自动选举配置错误引发的一系列问题

YashanDB

数据库 yashandb 崖山数据库

Autodesk AutoCAD2020(附安装教程图解) 中文特别版

Rose

win版HEU KMS Activator(Win/Office全自动激活工具) v42.0.4 激活版

iMac小白

秒懂测试框架需求与设计,快速提升测试效率!

测吧(北京)科技有限公司

测试

win版Perfectly Clear Workbench(图片编辑软件)v4.6.1.2663 特别版

iMac小白

Web自动化测试的持续集成实战

测吧(北京)科技有限公司

测试

邮件告警插件安装和使用:提取Job构建结果与多种通知方式

测吧(北京)科技有限公司

测试

win版Karaosoft Karma 2024(卡拉OK软件) v2024.5.8 特别版

iMac小白

ETLCloud中如何执行SQL脚本

RestCloud

sql ETL 数据集成 ETLCloud

Minitab Express 数据分析mac版 含破解补丁及安装教程 兼容M1/M2

Rose

win版DBeaver Ultimate (数据库连接管理) v24.1.0 特别版

iMac小白

win版AIDA64 Extreme(硬件检测工具)v7.30中文注册版

iMac小白

win版Abelssoft EasyBackup 2024(数据备份工具) v14.04 特别版

iMac小白

华为ICT大赛拿了奖,可以进华为吗?

华为云PaaS服务小智

开发者 华为云 比赛

微信多开 WechatTweak for Mac(微信多开、消息防撤回工具)集成中文版

Rose

win版StartAllBack(win11开始菜单增强工具)3.7.10特别版

iMac小白

开发体育直播APP软件系统源码:“新闻话题”获取体育资讯的首要平台

软件开发-梦幻运营部

Jenkins SSH 插件:安装与使用指南

测吧(北京)科技有限公司

测试

软件测试 | Jenkins API 数据提取能力

测吧(北京)科技有限公司

测试

事业-最佳实践-个人-专栏高效学习

南山

高效学习 技术专栏

win版Adobe Media Encoder 2024(Me2024)直装版

iMac小白

事业-最佳实践-个人-给别人提意见

南山

高效沟通

web3社交网络开发

区块链开发团队DappNetWork

win版ACDSee Photo Studio Professional 2024 v17.1.1.2859 激活版

iMac小白

Jigsaw项目另起炉灶_Java_Alex Blewitt_InfoQ精选文章