java jigsaw_Java 9和Project Jigsaw如何破坏您的代码

java jigsaw

Java 9迫在眉睫,它将带有完整的Project Jigsaw 。 在我从OpenJFX邮件列表的最近讨论中得知它可能会破坏现有代码之前,我并没有对此给予太多关注。 这对于Java非常不寻常,因此引起了我的兴趣。

我阅读了该项目的JEP和一些相关文章,得出的结论是,这将破坏现有代码。 是否会受到影响取决于您的项目,但是您可能会受到影响,也可能会受到伤害。

总览

在粗略介绍了Jigsaw项目的含义之后,我将描述可能发生的重大变化。

我从可用文档中编译了该更改列表。 当然不能保证我能抓住一切,并且由于我对某些概念不熟悉,所以我可能会误会某些事实。 买者自负。

如果您发现错误或认为某些事情可以变得更清晰或更精确,请发表评论,我很乐意加入您的意见。

拼图项目

我可能会在某个时候写一个关于Jigsaw项目的更详细的描述,但是现在我会很懒惰,只是引用一下:

该项目的主要目标是:

  • 使Java SE平台和JDK更容易地扩展到小型计算设备;
  • 总体上提高Java SE平台实现(特别是JDK)的安全性和可维护性;
  • 改善应用程序性能; 和
  • 对于Java SE和EE平台,使开发人员更容易构造和维护库和大型应用程序。

为了实现这些目标,我们建议为Java SE平台设计和实现一个标准模块系统,并将该系统应用于平台本身以及JDK。 该模块系统应具有足够的功能以模块化JDK和其他大型遗留代码库,但仍可供所有开发人员使用。

拼图项目现场– 2015年2月11日

如果您想了解更多有关该项目的信息,请查看其站点 ,尤其是目标和要求列表 (当前版本为2014年7月起的草案3 )。

这里要带走的主要东西是模块系统。 从版本9开始,可以将Java代码(以及JRE / JDK)组织在模块中, 而不是 JAR文件中。

Yoel Ben-Avraham在CC-BY-ND 2.0下发布。

发布时间由约尔·本·亚伯拉罕在CC-BY-ND 2.0 。

破解密码

这听起来像是内部重构,那么为什么要破坏现有代码? 好吧,它并不一定要这样做,兼容性甚至是项目的核心要求之一(与Java一样):

仅使用标准Java SE API以及可能还使用特定于JDK的API的应用程序必须以与今天相同的方式[…]运行。

拼图项目:目标与要求–草稿3

重要的部分是限定条件“仅标准API”。 有很多方法可以创建应用程序,这些应用程序的某些关键细节依赖于未指定或不建议使用的属性,例如非标准API,未记录的文件夹结构和JAR文件的内部组织。

因此,让我们看看潜在的重大变化。 有关更多详细信息,请确保检查项目的站点,尤其是JEP 220 ,该站点包含对随后大部分内容的更精确描述。

内部API变得不可用

使用JAR文件,任何公共类在JVM中的任何位置都是可见的。 这严重限制了JDK实现将内部API保持私有状态的能力。 取而代之的是许多方法都是可访问的,并且出于各种原因而经常使用它们(例如,为了提高性能或解决Java运行时中的[先前]错误; Java FAQ解释了为什么这可能是一个坏主意 )。

这随模块而变化。 每个模块将能够显式声明哪些类型作为其API的一部分可用。 JDK将使用此功能来正确封装所有内部API,因此将不可用。

事实证明,这可能是与Java 9不兼容的最大根源。由于它会引起编译错误,因此它肯定是最不敏感的。

为准备Java 9,您可以检查代码是否依赖于内部API。 您找到的所有东西都必须以一种或另一种方式替换。 一些变通办法可能已变得不必要。 其他类可能会进入公共API。 要确定是否存在这种情况,您必须进行研究,甚至可能要在OpenJDK邮件列表中询问您感兴趣的功能。

内部API

那么什么是内部API? 绝对是所有生活在sun.* -包装。 我无法确认com.sun.*所有内容是否也都是私有的-当然有一部分是但不是全部?

可能证明特别有问题的两个示例是sun.misc.Unsafecom.sun.javafx.*所有内容。 显然,前者已在许多项目中用于执行任务和性能关键代码。 从个人经验来看,我可以说后者是正确构建JavaFX控件的关键要素(例如,所有ControlsFX都依赖于这些软件包)。 还需要解决许多错误。

考虑将这两种特殊情况都转换为公共API(请参阅Unsafe和JavaFX ,尽管有些人宁愿看到Unsafe死于火灾 )。

工具支援

幸运的是,您不必手动找到这些依赖项。 从Java 8开始,JDK包含Java Dependency Analysis Tool jdeps ( 一些内部软件包的介绍, Windows和unix的官方文档),它可以列出项目所依赖的所有软件包。

如果使用-jdkinternals参数运行它,它将输出项目使用的所有内部API –恰好是Java 9发行之前必须处理的内部API。

JDK和JRE的合并

Project Jigsaw的主要目标是Java平台的模块化,以允许灵活地创建运行时映像。 因此,JDK和JRE失去了其独特的特性,并成为一系列模块组合中的两个可能的点。

这意味着这两个工件将具有相同的结构。 这包括文件夹结构以及任何依赖于它的代码(例如,通过利用JDK文件夹包含子文件夹jre的事实)将无法正常工作。

内部JAR变得不可用

内部JAR(如lib / rt.jarlib / tools.jar)将不再可访问。 它们的内容将以故意未指定且可能更改的格式存储在特定于实现的文件中。

假定这些文件存在的代码将停止正常工作。 这也可能会导致IDE或类似工具的过渡过渡,因为它们严重依赖这些文件。

运行时图像内容的新URL架构

一些API在运行时将URL返回到类和资源文件(例如ClassLoader.getSystemResource )。 在Java 9之前,这些是jar URL ,它们具有以下形式:

jar:file:<path-to-jar>!<path-to-file-in-jar>

Jigsaw项目将使用模块作为代码文件的容器,并且不再提供各个JAR。 这需要一种新格式,因此此类API会返回jrt URL

jrt:/<module-name>/<path-to-file-in-module>

使用此类API返回的实例来访问文件的代码(例如,使用URL.getContent )将继续像今天一样工作。 但是,如果它取决于jar URL的结构 (例如,通过手动构造它们或解析它们),它将失败。

取消认可的标准替代机制

Java API的某些部分被认为是独立技术 ,是在Java社区流程(例如JAXB )之外创建的。 可能需要独立于JDK进行更新或使用替代实现。 认可的标准替代机制允许将这些标准的替代版本安装到JDK中。

此机制在Java 8中已弃用,在Java 9中将被删除。其替代品是可升级模块 。

如果您从未听说过此消息,则可能不使用它。 否则,您可能想验证您使用的实现是否将成为可升级模块。

删除扩展机制

使用扩展机制,自定义API可以提供给JDK上运行的所有应用程序使用,而不必在类路径上命名它们。

此机制在Java 8中已弃用,在Java 9中将被删除。一些有用的功能将保留。

如果您从未听说过此消息,则可能不使用它。 否则,您可能需要检查JEP 220以获得详细信息。

Java 9的准备

这些变化共同给任何大型项目过渡到Java 9带来了风险。评估和减少它的一种方法可能是“更新高峰”:使用jdeps识别对内部API的依赖性。 修复这些问题之后,请花一些时间使用Java 9早期访问版本之一来构建和运行项目。 彻底测试系统的相关部分,以了解可能出现的问题。

通过这种方式收集的信息可以返回到项目,例如,通过将其发布在Jigsaw-Dev邮件列表中 。 引用JEP 220的(几乎)最后的话:

不可能确定摘要中这些更改的全部影响。 因此,我们必须依靠广泛的内部测试,尤其是外部测试。 […]如果其中某些更改对开发人员,部署人员或最终用户而言是无法克服的障碍,那么我们将研究减轻其影响的方法。

反射与&望

我们已经看到Project Jigsaw将模块化Java运行时。 内部API(包sun.*以及com.sun.* )将不可用,并且JRE / JDK的内部结构将发生变化,包括文件夹和JAR。 在Java 8中弃用它们之后,认可的标准覆盖机制和扩展机制将在Java 9中删除。

如果您想帮助您的朋友和追随者为Java 9做准备,请确保分享这篇文章。

到目前为止,我们专注于拼图项目的问题方面。 但这不应偏离计划中的令人振奋的,而且我认为非常积极的性质。 阅读文档后,我对即将发布的Java版本的范围和潜力印象深刻。 尽管对于单个开发人员而言,它可能不像Java 8那样具有突破性,但对于参与构建和部署的每个人(尤其是大型整体项目)而言,甚至更是如此。

因此,我一定会再次撰写有关拼图计划的文章-然后着重介绍好的方面。 如果您想了解更多信息,请继续关注。

翻译自: https://www.javacodegeeks.com/2015/04/how-java-9-and-project-jigsaw-may-break-your-code.html

java jigsaw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言的万能“三板斧”

点击蓝字关注我们作为嵌入式工程师&#xff0c;写一个效率高效&#xff0c;思路清晰的C语言程序是我们的终极目标。那么&#xff0c;怎样才能写好这样的程序呢&#xff1f;首先&#xff0c;我们要用C语言的思维方式来进行程序的构架构建&#xff1b;其次&#xff0c;要有良好的…

aws sqs_在Spring中将AWS SQS用作JMS提供程序

aws sqs最近AWS公布了新的客户端库&#xff0c;它实现了JMS 1.1规范 &#xff0c;并使用他们的简单队列服务 &#xff08;SQS&#xff09;作为JMS提供者 &#xff08;见杰夫巴尔的帖子在这里 &#xff09;。 在我的文章中&#xff0c;我将向您展示如何设置Maven项目以使用Sprin…

openmv串口数据 串口助手_STM32 串口接收不定长数据 STM32 USART空闲检测中断

编者注&#xff1a;单片机串口接收不定长数据时&#xff0c;必须面对的一个问题为&#xff1a;怎么判断这一包数据接收完成了呢&#xff1f;常见的方法主要有以下两种&#xff1a;1.在接收数据时启动一个定时器&#xff0c;在指定时间间隔内没有接收到新数据&#xff0c;认为数…

java 多线程性能_Java中多线程的性能比较

java 多线程性能Java中有多种用于多线程的技术。 可以通过同步关键字&#xff0c;锁或原子变量来并行化Java中的一段代码。 这篇文章将比较使用synced关键字ReentrantLock&#xff0c;getAndIncrement&#xff08;&#xff09;以及执行get&#xff08;&#xff09;和compareAnd…

C语言贪吃蛇小游戏 | 源码

点击蓝字关注我们该程序已经在VS2019上验证过了&#xff0c;可以直接运行。程序目录程序里就只有一个test.cpp文件&#xff0c;也就是说大家可以先创建工程&#xff0c;然后直运行效果C语言学习资源汇总【最新版】源码#include<stdio.h> #include<stdlib.h> #inclu…

东华大学计算机学院讲座单,计信学院成功举办2018级专业导师面对面系列讲座活动...

为帮助大一新生尽快适应大学生活&#xff0c;了解专业&#xff0c;掌握知识&#xff0c;计信学院积极响应学校号召&#xff0c;成立由教授、博士组成的专业导师团队&#xff0c;为各专业开展系列专业知识讲座。自10月17日晚7点至10月26日下午4点&#xff0c;各专业导师面对面系…

C函数指针别再停留在语法,得上升到软件设计

点击蓝字关注我们经常有朋友问到底如何在C程序中采用面向对象编程?如何让模块之间松耦合&#xff1f;......其实究其原因还是没有把C语言与软件设计很好的联系起来。这里跟大家找了一些内容&#xff0c;相信认真看完全文多多少少会有你想要的答案&#xff1a;正文部分&#xf…

spring默认缓存管理器_使用Spring的缓存管理器缓存Web内容

spring默认缓存管理器在这篇文章中&#xff0c;我想向大家展示如何使用Spring的CacheManager&#xff0c; Cacheable和JMX批注来缓存和管理Web内容的缓存的基础知识。 想象一下一个网上商店&#xff0c;它从远程WCMS&#xff08;Web内容管理系统&#xff09;获取一些内容&#…

计算机软件选修课选什么好,大学值得选的“选修课”,一点不比专业课差,能选上最好认真听...

原标题&#xff1a;大学值得选的“选修课”&#xff0c;一点不比专业课差&#xff0c;能选上最好认真听文/小哈你是怎样对待你的选修课的&#xff1f;以前经常听学长学姐们说过这样一句话&#xff0c;“上大学之后&#xff0c;专业课选逃&#xff0c;选修课必逃”。不知道大家是…

C/C++程序员的编程修养

点击蓝字关注我们什么是好的C/C程序员&#xff1f;是不是懂得很多技术细节&#xff1f;还是懂底层编程&#xff1f;还是编程速度比较快&#xff1f;我觉得都不是。对于一些技术细节来说和底层的技术&#xff0c;只要看帮助&#xff0c;查资料就能找到&#xff0c;对于速度快&am…

python账号密码一一对应_python模拟用户登录系统,如何两个用户输入各自的密码才能登入?...

展开全部 #我可以把我自己2113的成果送你&#xff0c;你来研究5261研究 import json #用来存储数据4102的模块 import os #用来进行文件操作1653 import sys #获取脚本所在目录用 import re #用来进行字符串操作 script_path os.path.realpath(__file__) PATH os.path.dirnam…

C语言#define与typedef的区别

点击蓝字关注我们在C语言编程中&#xff0c;typedef 和 #define是最常用语句&#xff0c;可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typedef的用法在C/C语言中&#xff0c;typedef常用来定义一个标识符及关键字的别名&#xff0c;它是语言编译过程的一部…

html文字添加波浪线,利用css渐变给文字下方加波浪线

具体代码如下.wavy-line-decoration {position: relative;line-height: 1.5em;}.wavy-line-decoration::before {content: ;position: absolute;bottom: -3px;width: 100%;height: 0.25em;background: // 可以给同一个元素同时添加多个背景渐变图层&#xff0c;用逗号隔开&…

新旧C++生成随机浮点数方法,你喜欢哪个?

点击蓝字关注我们一、在C11之前&#xff0c;我们通常采用rand函数来生成随机数。有时我们想用rand生成一组随机数&#xff0c;即使我们调用了srand&#xff0c;但生成的还是相同值。为什么会产生这种情况&#xff1f;又该如何解决&#xff1f;下面将用第一视角一起探究这其中的…

html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染

前言如图所示&#xff0c;webkit内核浏览器的渲染过程(解析HTML&#xff0c;构建DOM树&#xff0c;解析CSS&#xff0c;构建CSSOM树 &#xff0c;构建render树&#xff0c;布局layout&#xff0c;绘制painting)&#xff0c;这些过程理解起来可能有些抽象&#xff0c;今天我们一…

计算机进管理提示找不到入口,win10系统开机提示xxxdll模块已加载但找不到入口点的教程...

有关win10系统开机提示xxxdll模块已加载但找不到入口点的操作方法想必大家有所耳闻。但是能够对win10系统开机提示xxxdll模块已加载但找不到入口点进行实际操作的人却不多。其实解决win10系统开机提示xxxdll模块已加载但找不到入口点的问题也不是难事&#xff0c;小编这里提示两…

十大经典排序,你真的都会了吗?(源码详解)

点击蓝字关注我们一、前言&#xff1a;排序的概念排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…

jvm 架构_不可变的基础架构,热部署和JVM

jvm 架构您是否在生产中部署和取消部署基于JVM的应用程序&#xff08;无论JVM容器/无容器&#xff09;&#xff1f; 也就是说&#xff0c;当您拥有某个应用程序或服务的新版本时&#xff0c;是否通过“取消部署”和“热部署”该应用程序的新更新版本来更改正在运行的JVM&#x…

c语言默认参数_5.1 C++有默认参数的函数

点击上方“C语言入门到精通”&#xff0c;选择置顶第一时间关注程序猿身边的故事作者闫小林白天搬砖&#xff0c;晚上做梦。我有故事&#xff0c;你有酒么&#xff1f;C有默认参数的函数在函数调用时形参从实参获取值&#xff0c;因为实参的个数要和形参相同&#xff0c;但有时…

计算机组成原理唐朔飞课后答案第六章,计算机组成原理第六章部分课后题答案(唐朔飞版)...

计算机组成原理第六章部分课后题答案(唐朔飞版) 6.4 设机器数字‎长为8位(含1位符号‎位在内)&#xff0c;写出对应下‎列各真值的‎原码、补码和反码‎。 -13/64&#xff0c;29/128&#xff0c;100&#xff0c;-87 解&#xff1a;十进制数 二进制数 原 码 反 码 补 码 -13/64 …