【IT168 评论】近日,Java平台集团首席架构师Mark Reinhold参加今年的Devoxx大会。在大会上,Mark Reinhold发表了他对Jigsaw和Java 9的看法,指出了人们以往对Java 9新版本认知的十大误解。
误解一:Maven不适用于Java 9
Apache Maven的主席Robert Scholte宣布所有Maven版本3.0及以上版本都能够在Java 9上运行。某些插件可能仍存在一些问题,但在大多数情况下都可以正常运行。
误解二:程序员依赖的工具、库以及框架都不能在Java 9上运行
有许多工具和框架都可以在Java 9上使用,如:
· Maven 3.0.0
· TestNG 6.11
· Log4J 2.8.2
· Clojure 1.8.0 *
· JUnit 4.12 & 5.0.0-M4
· IntelliJ 2017.2
· Spring Boot 1.5.3 & Spring Framework 4.3.8等
Oracle的开发团队向程序员推荐了以上的工具和框架,这些可以确保Java 9的兼容性和访问权限。
误解三:要想使用Java 9就必须模块化
这种想法是错误的。如果要在Java 9中导入一个在Java 8中构建的系统,其实是可以运行的,而且在类路径上运行的问题很少。但现在必须面对的问题是内部API依赖的处理,实施强封装是Jigsaw主要功能之一,但是这样以来我们就无法访问所有非关键的内部API。以下是在JDK增强提案(JEP 260)中所述的JDK特定模块中,仍可以访问的部分关键API:
· sun.misc.{Signal,SignalHandler}
· sun.misc.Unsafe (这个类中的许多方法可以通过variablehandles (JEP 193)实现)
· sun.reflect.Reflection::getCallerClass(int) (此方法的功能可以通过JEP 259以标准形式提供)
· sun.reflect.ReflectionFactory.newConstructorForSerialization
为了让强封装不破坏Java 9的向后兼容性,帮助系统更轻松的迁移到模块化Java平台,Mark Reinhold提出允许非法反射访问的类路径代码默认在JDK 9中,并在未来的版本中禁用。由于Mark Reinhold的提议,我们现在可以通过编译和运行时的命令行标志访问非关键API。
但是,如果你想自己处理这些依赖性API,最好的选择就是将这些API替换成维护的API。
误解四:类似于OSGi的模块在Java 9根本不能运行
这个理解是错误的。只要不使用内部API,OSGi这一类的模块仍然会按照预期方式使用类路径,Java 9并没有阻止使用第三方模块系统。
误解五:Java 9中类路径的代码不能使用某些模块导致Java社区分解
这种想法过于偏激了。类路径上的代码可以读取所有公共以及受保护类型的解析模块,这允许较大系统逐渐迁移。此外,一个可以被a.JAR文件运输的库或者框架可以被转化成一个模块。
误解六:强封装是Java 9被接受的唯一障碍
强封装绝对不是Java 9使用的唯一障碍,人们依赖的内部API现在已经被隐藏了,但是这个版本中还有很多不兼容的东西。Rt.jar已经被一种新的更可靠的格式取代,系统图像的布局也不同,一系列系统类有待提高安全性,这就意味着它们由类加载器加载,但是与引导类加载不同,版本字符串格式被改变了。
误解七:sun.misc.Unsafe不会在Java 9中,所有的东西都会被中断
这个担心可能是多余的。sun.misc.Unsafe的API和其他常用内部API一样仍可在Java 9中进行访问。
前面说到,Jigsaw的强封装会让我们以前依赖的许多的内部API无法访问。虽然强封装不是唯一的障碍,但也会造成一定的问题。为了解决这个问题,Reinhold提出处理这些API的步骤:
1、 如果在JDK 8中有支持替换——>API封装到JDK 9中。
2、 如果在JDK 8中无支持替换——>API不封装到JDK 9,仍可被外部代码访问。
3、 如果在JDK 9中有支持替换——>抛弃,然后API封装到JDK 9中,而且很有可能在JDK 10中删除。
这个计划针对的是允许非法访问最常用的内部API,直到新的更换标准API引入平台。
误解八:Jigsaw将修复多版本问题
这个计划好像还没有开始实行,虽然Java社区的一部分人都希望Java 9能够以允许方便快捷的加载给定名称的多个不同模块。相反,来自甲骨文的Alan Bateman建议应该从构建工具和容器入手,来解决同一模块的多版本问题。
误解九:Jigsaw无法修复多版本问题,压根不能用
关于多版本的解决有两个主要的含义:
1、 用类加载器以任何方式工作的API将以不兼容的方式发生变化。任何对类加载器关系做出假设的代码都不会像以前那样工作。
2、 构建工具需要重新优化支持多版本
Jigsaw团队正在努力的解决这些问题。
误解十:现有系统模块化很容易
JDK模块化花了9年的时间,任何大型系统都需要话费大量时间和资源才能从上一个版本转化到下一个版本,而且最终获得的成品可能还会不尽人意。在模块化现有系统之前,权衡成本和收益是必须要考虑的问题。如果你正在构建一个新的项目,那一定要使用模块化。