欢迎来到Java学习网!
设为首页 | 加入收藏
当前位置: 首页 > Java环境 > JDK >

编者按:JDK软件包之间的相互依赖性一直是使用Java 平台最大的非议之一,因为就到具体应用的时候这会产生庞大臃肿的架构。很多开发者希望JDK 变小、变快,正处于开发中的JDK7是否会实现这些功能、重铸JDK的锋芒呢?JDK7的进展状况和新性能又是怎样的呢?本文,JDK核心团队的工程师Alan Bateman就此展开了话题:

JDK7的一个任务就是为我们提供模块化平台,但要做到这一点真的很困难,因为它的代码基与许多讨厌的依赖有着千丝万缕的联系,这些依赖存在于API和许多不同区域的执行之间。这些依赖已经建立了很多年,举例来说:假设你正使用Logging API(java.util.logging)),Logging需要NIO和JMX,JMX需要JavaBeans, JNDI, RMI和CORBA,JNDI需要java.applet.Applet而且JavaBeans依赖AWT, Swing例子有很多,但结论很明显:使用Logging API是非常不明智的,因为最终这会导致对整个平台的依赖。(这里要说明一下:这些都只是依赖,logging当然不需要真的去加载CORBA的超过1600个class)

好消息是,我们已经开始在上几个构建中做出进步来解决这些问题。Logging不再需要JMX(这需要一个API的变化:回退和重新访问(backed-out/re-visited));我们还析出RMI IIOP transport,这样即便没有CORBA你也可以远程管理;没有JavaBeans,JMX也一样可以自我测试;JNDI中不再需要java.applet.Applet;JavaBeans不再需要JDBC;AWT不再需要RMI

所以现在我们有了一个初步的模块基础,尤其是核心库(lang/io/net/util/nio/security)。原来存在于JNDI、部署代码(deployment code)、AWT、参数、logging API及JMX中的依赖已经被移除或者倒置。不过仍有一个XML解析下的依赖(来自java.util.Properties),但它很快也会被解决。

Swing, AWT, 2D等都已经进入了客户端模块化的阶段。由于这些模块中的API的关联性很强,所以模块化工作很有挑战性。还有一些来自于其他模块(比如web服务)的一些依赖,不过最终这些都会解决掉,到时可以用于嵌入式设备。

我们有几个细粒度模块,可能在未来被划为粗粒度模块。Logging, RMI, JSSE (SSL), SASL, JDBC, JNDI, LDAP以及其他JNDI供应商、PKCS11和其他安全供应商将为它们命名。JSSE是从平台其他区域剥离的很好的例子,也许有人会认为它不需要发送请求就可以做安全连网,但由于SSL能够基于身份验证来使用Kerberos,所以实际上JSSE取决于Kerberos/JGSS。这种情况下,依赖就是可选的,即如果安装了Kerberos,那么在执行安全的时候SSL会包括Kerberos密码组件,如果没有安装Kerberos,则不会请求使用Kerberos。

我上文提到的CORBA还经常成为用户指责JDK承载的兼容包的话柄,因为一个好的模块应该抛弃那些无用的、遗留的、不受欢迎的包的兼容。所以,Sean Mullan和Vincent Ryan在jdk7 b78中做了很多工作,删除了对无用安全类的依赖,从而这些无用安全类就不必存在于基础模块中。其他准备被移除的包括继承的sun.io转换器,我们早应该遗弃它只是JDBC驱动对它的依赖尚未移除;还有sun.misc中的许多类也都没用了,但我们还是没法删除因为许多应用直接使用它们。

值得一提的是,模块并不一定与封装边界(package boundaries)一致。当然最理想的状况是一个模块涵盖一个或多个完整包中所有的类,但许多情况下这是不可能的。我上文提到的JavaBeans就是一个很好的例子:将属性事件支持(property event support)和注释从自省和其他连接客户端区域的类中分离出来。New I/O和Logging等API有管理界面,所以将管理界面、管理模块与JMX、java.lang.management聚合很有意义。上文我还提到了IIOP transport从RMI Connector中分离,这种情况下,rmic编辑器将生成抽头与javax.management.remote.rmi包联系在一起,但我们不需要将这些与管理模块聚合因为它会产生对CORBA的依赖。

我希望通过我的上述能让你了解JDK 7所正在做的。上文提到的很多都是为了移除依赖性,为的是一个更加模块化的JDK,从而可以使我们更接近提高性能(下载和启动时间)、建立平台缩放性的目标。不过很多工作需要分几步来完成,因此最初的构建会生成JAR文件,但最终我们会转换成一个更好的格式。
 

    相关教程
    推荐内容