Java 9和Project 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做准备,请确保分享这篇文章。

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

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

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

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

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

相关文章

mysql 表结构 增删改查_mysql学习【第3篇】:数据库之增删改查操作

注意的几点&#xff1a;1.如果你在cmd中书命令的时候&#xff0c;输入错了就用\c跳出2.\s查看配置信息一、操作文件夹(库)增&#xff1a;create database db1 charset utf8;删&#xff1a;drop database db1;改&#xff1a;alter database db1 charset gbk;查&#xff1a;show …

HTML5的非主体结构元素(header、footer、hgroup、assress)

header元素footer元素hgroup元素address元素网页编排规则 1.header元素 代码演示: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>header元素</title> </head> <body> &l…

DVWA通关教程(上)

简介&#xff1a; DVWA是一款基于PHP和mysql开发的web靶场练习平台&#xff0c;集成了常见的web漏洞如sql注入,xss&#xff0c;密码破解等常见漏洞。本教程将以DVWA为例&#xff0c;演示常见的web漏洞的利用和攻击。 登录创建数据库&#xff08;账号为admin&#xff0c;密码为…

HTML5表单新增元素与属性(form、formaction、formmethod、formenctype、formtarget、autofous、required、labels)

表单内元素的form属性表单内元素的formaction属性​​​​​​​表单内元素的formmethod属性​​​​​​​表单内元素的formenctype属性​​​​​​​表单内元素的formtarget属性​​​​​​​表单内元素的autofous属性​​​​​​​表单内元素的required属性​​​​​​​…

2048

最近用WPF写了款2048的小游戏&#xff0c;最早接触这款游戏是在手游上&#xff0c;觉得蛮好的&#xff0c;于是就用WPF实现了下&#xff0c;界面运行流畅&#xff0c;操作便捷&#xff0c;虽说程序在可玩度上还稍有欠缺&#xff0c;不过这也是WPF在游戏开发中的一个新篇章 程序…

表单新增元素与属性(control、placehoulder、list、AutoComplete、pattern、SelectionDirection、indeterminate属性)

标签的control属性文本框的placehoulder属性文本框的list属性文本框的AutoComplete属性文本框的pattern属性文本框的SelectionDirection属性复选框的indeterminate属性image提交按钮的height属性与width属性1.标签的control属性 代码演示: <!DOCTYPE html> <html la…

jboss7.0.2_JBoss AS 7.0.2“ Arc”发布–使用绑定选项

jboss7.0.2有关JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已经发布&#xff01; 自AS 7.0.1发布以来已经过去了一个月。 在这短时间内&#xff0c;修复了许多错误&#xff0c;并实现了更多功能和改进。 所有这些错误修复和功能已包含在此7.0.2版本中。 此新版…

DVWA通关教程(中)

不安全的验证码&#xff08;Insecure CAPTCHA&#xff09; Insecure CAPTCHA(不安全的验证码)主要是绕过验证码的安全验证&#xff0c;一般都有逻辑漏洞。 难度&#xff08;low&#xff09; 审计代码 <?phpif( isset( $_POST[ Change ] ) && ( $_POST[ step ] 1 …

UVa 208 Firetruck【回溯】

题意&#xff1a;给出一个n个节点的无向图&#xff0c;以及某个节点k&#xff0c;按照字典序从小到大输出从节点1到节点k的所有路径 看的题解 http://blog.csdn.net/hcbbt/article/details/9755147 因为节点数很少&#xff08;小于20&#xff09;&#xff0c;所以可以先用floyd…

html中使用静态图片做一个csdn网站的首页

简单使用csdn网站的截图做一个网站的DEMO, 简单把CSDN网站分为四个图片(自己截图),分别为上,左,中,右,使用IDEA创建一个静态Web项目。 代码演示:(不添加样式,简单演示效果) <!DOCTYPE html> <html lang="en"> <head><meta chars…

使用docker-compose的Spring会话演示

我之前已经写过一个令人振奋的新项目&#xff0c;称为Spring-session &#xff0c;它为基于Java的Web应用程序提供了一种外部化用户会话的干净方法。 我设法使用docker-compose为spring-session进行了良好的演示设置&#xff0c;这展示了该项目的优势&#xff0c;我想在这里写…

kail利用msf工具对ms11-003漏洞入侵渗透Win7

前言&#xff1a; windows7IE溢出攻击 实验环境&#xff1a; 工具&#xff1a;metasploit 靶机两台&#xff1a;windows 7和kali2020 攻击机IP地址&#xff1a;10.20.29.129 被攻击机IP地址&#xff1a;10.20.29.134 步骤&#xff1a; 1、在kali里面打开metasploit漏洞…

python中升级pip报错_linux系统下pip升级报错的解决方法

Pip 安装1、在python中提供了一个get-pip.py;下面是地址https://bootstrap.pypa.io/get-pip.py2、在Linux下执行curl https://bootstrap.pypa.io/get-pip.py | python进行下载安装这样很方便了 想装什么包就装什么包Pip install xxx注意&#xff1a;升级完python版本注意&…

域名如何设置才能带www和不带www都能正常访问

在自己的域名添加两条解析记录&#xff0c;一个带www,另一个记录不设置即可。然后绑定到正常的站点。

微软MS11-050漏洞的利用

微软MS11-050漏洞的利用 0x00 前言0x01 环境搭建1. 虚拟机系统2. 拓扑结构 0x02 利用过程1. 相互ping通2. 启动Metasploit3. 查找和MS11-050相关的模块4. 加载模块5. 设置所使用的payload6. 显示需要配置的选项7. 设置Web服务器的地址&#xff0c;应为BackTrack虚拟机的地址8.…

python中数据类型大小_详细解析Python中的变量的数据类型

变量是只不过保留的内存位置用来存储值。这意味着&#xff0c;当创建一个变量&#xff0c;那么它在内存中保留一些空间。根据一个变量的数据类型&#xff0c;解释器分配内存&#xff0c;并决定如何可以被存储在所保留的内存中。因此&#xff0c;通过分配不同的数据类型的变量&a…

Java中多线程的性能比较

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

微软ms10_018漏洞的利用

微软ms10_018漏洞的利用 0x00 前言0x01 study1. 漏洞利用环境1.1 目标机环境1.2 攻击机环境1.3 拓扑结构 2. ping测试3. exploit3.1 启动Metasploit3.2 查找和MS10-018相关的模块3.3 加载模块3.4 设置PAYLOAD3.5 显示需要配置的选项3.6 设置Web服务器的地址&#xff0c;应为Ba…

【深度】机器学习进化史:从线性模型到神经网络

【深度】机器学习进化史&#xff1a;从线性模型到神经网络 Reza Zadeh是斯坦福大学工程计算和数学研究所顾问教授&#xff0c;也是Databricks公司技术顾问&#xff0c;他主要专注于机器学习理论和应用&#xff0c;分布式计算&#xff0c;以及离散应用数学。近日&#xff0c;他接…

微软MS10-046漏洞的利用

微软MS10-046漏洞的利用 0x00 前言0x01 环境1. 目标机环境2. 攻击机环境3. 拓扑结构 0x02 过程1. 相互ping通2. 启动Metasploit3. 查找和MS10-046相关的模块4. 加载模块5. 设置所使用的payload6. 设置文件共享服务器的地址&#xff0c;应为BackTrack虚拟机的地址7. 设置目标主…