“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

Jigsaw 蓄势待发

  • 2009-07-06
  • 本文字数:2507 字

    阅读完需:约 8 分钟

Java 7 有三个主要目标。首先是通过 Jigsaw 项目模块化 Java 平台。第二是通过 invokeDynamic 指令和达芬奇机项目将JVM 发展为多语言平台,第三是通过项目Coin 来解决Java 程序员面对的一些常见生产效率问题。

将Java 平台模块化带来了许多好处:通过消除JDK 里众多类之间日益增长的相互依赖而改善了性能;由于允许下载JDK 的子集而不是一次下载整个平台,减少了下载量;允许在内存有限的设备如嵌入式控制器上安装JRE 的一个子集。

Sun 公司正在采取双管齐下的办法来构建 JDK7 的模块化特性:JSR 294 和 Jigsaw。JSR 294 的主要目的是提高编译时和运行时环境之间的逼真度(fidelity)。这将增加语言功能来支持 Java 的模块系统,并更新目前需要类路径信息的重要组成部分,如 javac 和 JVM 本身。JSR 294 最终将取消类路径。因为它独立于 Jigsaw ,所以也可用于其他模块化系统,如 OSGi ,甚至可以用于其他处理依赖关系的工具如谷歌的 Guice 或未来版本的 JSR 299(Java 的上下文和依赖注入) 。

Jigsaw 将使用给 JSR 294 开发的部分特性,为 Sun 的 JDK7 实现构建模块系统。它是 Sun JVM 的一个实现细节 ,不会成为 JSR 的一个标准,而且技术上也不属于 Java SE 。令人惊讶的是,Jigsaw 与它打算取代的类路径,尽管是 Java 主机系统的事实标准,但都不属于 Java 语言规范。Sun 已经创建了 OpenJDK 的一个开源子项目 ,也称为 Jigsaw。该子项目将拥有 JSR 294 参考实现以及 Jigsaw 模块系统的设计与实现。

Alex Buckley 在今年的 JavaOne 大会演讲上提供了一些 JSR 294 和 Jigsaw 如何工作的技术细节。其主要特征是引入了一个标准模块信息接口,Java 程序可以使用它来指定依赖和其他细节。详细信息包括模块 id,应用程序的主类,程序提供的模块和所依赖的模块。详细信息中还可包括版本信息(可选的),这会让 Sun 和开发者在将来易于修改已经被广泛使用的类库和 API。一个来自 Buckley 的幻灯片的例子:

module org.planetjdk.aggregator @ 1.0 {
system jigsaw;
requires module jdom @ 1.*;
requires module tagsoup @ 1.2.*;
requires module rome @ =1.0;
requires module rome-fetcher @ =1.0;
requires module joda-time @ [1.6,2.0);
requires module java-xml @ 7.*;
requires module java-base @ 7.*;
class org.planetjdk.aggregator.Main;
}

使用此模块信息,Jigsaw 的打包工具(jpkg)能够创建一个映射部署文件,可以根据不同的平台而变化而且更紧密的与平台的能力相结合。这样 Jigsaw 将使得 Java 桌面应用在 sun 支持的各个平台上更加接近一等公民, 这是 Sun 振兴桌面 Java 所做努力的一个关键步骤。Mark Reinhold 在 JavaOne 会议上演示了Jigsaw 目前的一些能力,使用Linux 的Synaptic Package Manager 为一个简单的应用逐步建立需求,从一个基础的Java 模块开始逐步增加额外的模块,如AWT 和Swing 。

Sun 决定兴建 Jigsaw 而不是使用现有的模块系统例如 OSGi 是非常有争议的, Sun 并没有清楚的阐明为什么它已决定走这条路。在最近 Java Posse 的一个 podcast 中,Mark Reinhold 和 Alex Buckley 也提供了一些关于两者分歧的技术细节,阐明了为什么 Sun 公司决定建立自己的系统。除了如同 OSGi 那样将打包的应用更多的绑定于平台之上,两个系统的依赖模型是不同的。Sun 公司需要能够将包劈成不同的模块并将在运行时把它们加载到相同的类加载器中——例如 java.util 包可能被劈成不同的模块(甚至对有内存限制的装置有不同的实现)。为了支持这一特性 Jigsaw 有一个本地依赖的概念,该概念是递归的。所以,如果模块‘Swing’对于 AWT 有本地依赖而模块‘AWT’对于模块‘base’有一个本地依赖 ,那么在运行时模块 Swing、AWT 和 base 都将在同一类装载器中加载。虽然在 OSG 中的片段(frament)也是类似的概念,但不够更灵活,片段自己无法表达依赖性。

企业专家小组联席主席 Eric Newcomer 对此仍持怀疑态度。在最近的博客中,他把 Jigsaw 描述为“Sun 重新发明 OSGi 的最新尝试,或在任何情况下阻挠 OSGi 或者建立他们能控制的 OSGi 替代品”,他继续写道:

“我今年没有参加 JavaOne 大会,所以可能由于我没有亲临而有错误的印象,但我的理解是,项目 Jigsaw 没有提到 OSGi 。Java 7 的计划说明也没有提到。因此,对于 Jigsaw 项目是否是对 Java 模块化的一个威胁这个问题,我的答案是,是的。”

其他一些博客被 Sun 的努力所打动,给出了积极的响应。其中 Bram Bruneel 对本地包生成留下了深刻的印象:

…Mark 向我们展示了一个在 Ubuntu 上打包和分发 Java 应用的不错的演示 。JDK 模块将会是标准的 Debian 软件包,您将能够创建自己的 Java 应用程序,导出为 Debian 软件包,并确定运行您的应用程序所需要的 Java 模块依赖。”

Alex Miller 在他的文章中对 Jigsaw 的推崇是有见地的:

“项目目标是雄心勃勃的——在演示中有一个相当清晰的愿景,比我以前理解的要宽广得多。这个愿景包括对于我们如何编译、封装、启动我们的 Java 应用程序的全新方案。”

Glyn Normington 听了 Java Posse 的 podcast 并写了评论:

“很高兴看到新出现的一些技术细节,我开始明白为什么 OpenJDK 选择与 Apache 的 Harmony 不同的模块化方案。”

Dalibor Topic 对于本地打包工具的潜能特别感兴趣:

“语言概念的模块与实际模块系统的分离,可以让我们使用类似 jpkg 的工具来创建一个抽象模块到实际部署文件的 N:M 映射。为特定平台自由挑选其最好的发布机制有明显的好处,例如,在有一个软件包管理器的平台上,最友好的 JDK 发布方式是通过相应的软件包来发布。不用花大力气,通过提前编译转为平台所需要的本地化代码也成为可能:这一工作被转化为(在模块被封装为部署文件之前)可以应用于模块的另一个后期处理步骤,如在当前的 jpkg 代码中的 pack200 和 LZMA 压缩。将一个模块透明的分割为几个本地部署文件也变得很容易实现,例如,JNI 库也可以转化为几个独立的、特定于架构的包,这样对于拥有多个架构本地代码的复杂应用,减少了下载量(顺便说一下,就像 JDK 一样);同样,发布一个非常小的更新包来替换本地代码中一段有缓冲区溢出问题的代码片段也变得非常容易。”

查看英文原文: Jigsaw Falling Into Place

2009-07-06 06:022081
用户头像

发布了 47 篇内容, 共 98860 次阅读, 收获喜欢 3 次。

关注

评论

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

Vue + Node.js 搭建「文件上传」管理后台

蒋川

Vue Node Node Exporter

MyBatis实现一对一,一对多关联查询,HTTPS面试常问全解析

爱好编程进阶

Java 面试 后端开发

PlatoFarm推出正式版游戏经济模型的特点分析

西柚子

Java BSON使用,Java研发岗必问30+道高级面试题

爱好编程进阶

Java 面试 后端开发

世界读书日晒出你的书单,有机会领取免费读书年卡!

InfoQ写作社区官方

书籍推荐 热门活动 2022世界读书日

Redis面试题汇总,mysql索引优化面试题常问

爱好编程进阶

Java 面试 后端开发

Java 方法的使用(方法重载、形参和实参调用关系,作为Java程序员都应掌握

爱好编程进阶

Java 面试 后端开发

企业选择私有化部署的IM即时通讯软件,全力保护信息安全!

WorkPlus

Myabtis源码分析五-Mybatis配置加载完全图解,建造者模式的使用,涵盖Java各种技术栈

爱好编程进阶

Java 面试 后端开发

Netty权威指南:Linux网络-I-O-模型简介,分享我在Java开发中走的一些弯路

爱好编程进阶

Java 面试 后端开发

RocketMQ msgId与offsetMsgId释疑(实战篇),腾讯技术官发布的“神仙文档”火爆网络

爱好编程进阶

Java 面试 后端开发

Spring Boot 实战 :入门篇,想给金三银四找工作的程序员几点建议

爱好编程进阶

Java 面试 后端开发

Apache Flink 在蔚来汽车的应用

Apache Flink

大数据 flink 编程 流计算 实时计算

IT人不仅要提升挣钱能力,更要拓展挣钱途径,腾讯技术官发布的“神仙文档”火爆网络

爱好编程进阶

Java 面试 后端开发

Java基础12 面向对象~多态,java中级开发面试知识点

爱好编程进阶

Java 面试 后端开发

OutOfMomeryError异常实例与处理,zookeeper面试题总结

爱好编程进阶

Java 面试 后端开发

interrupted()和isInterrupted()详述,百万数据分页查询的方法及其优化方式

爱好编程进阶

Java 面试 后端开发

Java程序员如何加入自己理想的大厂呢?本人来分享亲身经历的腾讯Java技术岗的面经。

爱好编程进阶

Java 面试 后端开发

Java经典算法题(二),这10个经典又容易被人疏忽的JVM面试题

爱好编程进阶

Java 面试 后端开发

每周问答精选:PolarDB-X完全兼容MySQL吗?

阿里云数据库开源

数据库 阿里云 开源 polarDB PolarDB-X

智能手表的下半场,机遇与挑战并存

FinClip

带你了解极具弹性的Spark架构的原理

华为云开发者联盟

spark mapreduce 内存 RDD Spark架构

redis优化系列(一)基于docker搭建Redis主从

乌龟哥哥

4月月更

Java有线程安全的set吗?,跳槽薪资翻倍

爱好编程进阶

Java 面试 后端开发

博睿数据携手F5共同构建金融科技从代码到用户的全数据链DNA

博睿数据

java的反射用不好容易走火入魔?还可以用内省啊!,网易java面试题和答案

爱好编程进阶

Java 面试 后端开发

如何进行项目协同管理

阿里云云效

阿里云 项目管理 敏捷开发 项目协同 研发协作

浅谈IM系统中离线消息、历史消息的最佳实践

WorkPlus

Java文件读写原理和虚拟内存,面试阿里

爱好编程进阶

Java 面试 后端开发

运行npm install命令的时候会发生什么?

华为云开发者联盟

node.js npm install npm install

Java并发体系详解,聊一聊MySQL数据库中的那些锁

爱好编程进阶

Java 面试 后端开发

Jigsaw蓄势待发_Java_Charles Humble_InfoQ精选文章