范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JDK8升级高版本JDK指南

  没耐心的可以直接跳到后面的实战准备工作下载新版本的JDK
  从Java SE 下载下载并安装新的 JDK 版本。 在重新编译之前运行你的程序
  尝试在最新的 JDK 版本 上运行您的应用程序。大多数代码和库无需任何更改即可在 新版本上运行,但可能有一些库需要升级。
  当您运行应用程序时,请查看来自 JVM 的有关过时 VM 选项的警告。如果 VM 无法启动,则查找Removed GC Options。
  如果您的应用程序成功启动,请仔细查看您的测试并确保其行为与您一直使用的 JDK 版本相同。例如,一些早期采用者注意到他们的日期和货币格式不同。请参阅默认使用 CLDR 区域设置数据。
  要使您的代码在最新的 JDK 版本上运行,请了解每个 JDK 版本中的新功能和更改。 有关 JDK 17 中的新功能和更改的详细信息,请参阅JDK 17 中的新增功能 - 新功能和增强功能。 有关 JDK 16 中的新功能和更改的详细信息,请参阅JDK 16 中的新增功能 - 新功能和增强功能。 有关 JDK 15 中的新功能和更改的详细信息,请参阅JDK 15 中的新增功能 - 新功能和增强功能。 有关 JDK 14 中的新功能和更改的详细信息,请参阅JDK 14 中的新增功能 - 新功能和增强功能。 有关 JDK 13 中的新功能和更改的详细信息,请参阅JDK 13 中的新增功能 - 新功能和增强功能。 有关 JDK 12 中的新功能和更改的详细信息,请参阅JDK 12 中的新增功能 - 新功能和增强功能。 有关 JDK 11 中的新功能和更改的详细信息,请参阅JDK 11 中的新增功能 - 新功能和增强功能。 有关 JDK 10 中的新功能和更改的详细信息,请参阅 JDK 10 中的新增功能。 有关 JDK 9 的所有新功能的完整列表,请参阅 JDK 9 中的新增功能。 有关 JDK 9 中更改的详细信息,请参阅JDK 9 发行说明。
  即使您的程序看起来运行成功,您也应该完成本指南中的其余步骤并查看问题列表。 更新第三方库
  对于您使用的每个工具和第三方库,您可能需要一个支持最新 JDK 版本的更新版本。
  检查第三方库和工具供应商的网站,了解每个库或工具的版本,这些库或工具设计用于最新的 JDK。如果存在,则下载并安装新版本。
  如果您使用 Maven 或 Gradle 构建应用程序,请确保升级到支持最新 JDK 版本的最新版本。
  如果您使用 IDE 开发应用程序,那么它可能有助于迁移现有代码。NetBeans、Eclipse 和 IntelliJ IDE 都有可用的版本,包括对最新 JDK 的支持。
  您可以在 OpenJDK wiki 上的 Quality Outreach上查看使用 OpenJDK 构建的许多免费开源软件 (FOSS) 项目的测试状态。 如果需要,编译您的应用程序
  使用新版本的 JDK 编译器编译您的代码将简化向新版本的迁移,因为代码可能依赖于已被确定为有问题的 API 和特性。但是,这不是绝对必要的。
  如果您需要使用 JDK 11 和更高版本的编译器编译代码,请注意以下几点: 如果您("_")在源代码中使用下划线字符作为单字符标识符,那么您的代码将无法在 JDK 11 及更高版本中编译。它会在 JDK 8 中生成警告,并从 JDK 9 开始生成错误。
  举个例子:
  static Object _ = new Object();
  此代码从编译器生成以下错误消息:
  MyClass.java:2: error: as of release 9, "_" is a keyword, and may not be used as a legal identifier.  如果您将-sourceand-target选项与 一起使用javac,请检查您使用的值。
  支持的-source/-target 值为 17(默认值)、16、15、14、13、12、11、10、9、8 和 7。
  在 JDK 8 中,不推荐设置 -source和-target的值为1.5/5或更早的值,如果设置这样值有警告。在 JDK 9 及更高版本中,这些值会直接抛出Error。
  >javac -source 5 -target 5 Sample.java warning: [options] bootstrap class path not set in conjunction with -source 5 error: Source option 5 is no longer supported. Use 6 or later. error: Target option 1.5 is no longer supported. Use 1.6 or later.
  使用新的--release标志而不是-source -target选项。请参阅 Java Development Kit Tool Specifications 中的javac。
  —release标志的有效值和-source -target选项相同。
  javac命令可以识别和处理大于等于 JDK 1.0.2 版本源文件。
  请参阅JEP 182:停用 javac -source 和 -target 选项的策略。
  JDK的内部API,例如 sun.misc.Unsafe  在 JDK 11 及更高版本中仍然可以访问,但大多数 JDK 的内部 API 在编译时无法访问。您可能会收到编译错误,表明您的应用程序或其库依赖于内部 API。
  识别依赖关系,请运行 Java 依赖关系分析工具。如果可能,请更新您的代码以使用支持的替换 API。
  您可以使用--add-exports和--add-opens 选项作为临时解决方法来编译引用 JDK 内部类的源代码。有关这些选项的更多信息, 请参阅JEP 261:JDK 中的模块系统和强封装。 您可能会看到比以前更多的弃用警告。 在您的代码上运行 jdeps
  在您的应用程序上运行该jdeps工具以查看您的应用程序和库所依赖的包和类。如果您使用内部 API,则jdeps可能会建议替换以帮助您更新代码。
  要查找对内部 JDK API 的依赖关系,请jdeps使用该-jdkinternals选项运行。例如,在调用了sun.misc.BASE64Encoder的类上运行jdeps,您将看到:
  >jdeps -jdkinternals Sample.class Sample.class -> JDK removed internal API Sample -> sun.misc.BASE64Encoder JDK internal API (JDK removed internal API) Warning: JDK internal APIs are unsupported and private to JDK implementation that are subject to be removed or changed incompatibly and could break your application. Please modify your code to eliminate dependency on any JDK internal APIs. For the most recent update on JDK internal API replacements, please check: https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool JDK Internal API Suggested Replacement ---------------- --------------------- sun.misc.BASE64Encoder Use java.util.Base64 @since 1.8
  如果您使用 Maven,则有一个jdeps 可用的插件。
  有关jdeps语法,请参阅jdepsJava 开发工具包工具规范 。
  但是注意:jdeps是静态分析工具,代码的静态分析可能无法提供完整的依赖关系列表。比如如果代码使用反射来调用内部 API,则jdeps无法发出警告。
  迁移
  JDK 8 和更高版本的 JDK 之间发生了重大变化。
  每个新的 Java SE 版本都会引入一些与以前版本的二进制、源代码和行为不兼容的问题。JDK 9 及之后的 Java SE 平台的模块化带来了许多好处,但也带来了许多变化。仅使用官方 Java SE 平台 API 和受支持的特定于 JDK 的 API(supported JDK-specific APIs) 的代码应继续工作而无需更改。使用 JDK 内部 API 的代码应继续运行,但应迁移以使用受支持的 API。
  某些 API 在其默认行为中已被设置为不可访问、删除或更改。编译或运行应用程序时可能会遇到问题。请参阅 已删除的工具和组件以及安全更新。
  以下部分描述了将 JDK 8 应用程序迁移到更高版本的 JDK 时应注意的 JDK 包中的更改。
  查看运行应用程序时可能遇到的更改列表。 JDK中的强封装
  一些工具和库使用反射来访问仅供内部使用的 JDK 部分。这种反射的使用会对 JDK 的安全性和可维护性产生负面影响。为了帮助迁移,JDK 9 到 JDK 16 允许这种反射继续进行,但发出有关 非法反射访问 的警告。但是,JDK 17 是  强封装(strongly encapsulated) 的,所以默认情况下不再允许这种反射。访问 API 的非public字段和非public方法的代码java.*将抛出 InaccessibleObjectException.
  请注意,所有 JDK 版本(包括 JDK 17)中的工具和库都可以使用sun.misc和sun.reflect 包进行反射。
  java启动选项--illegal-access 允许在 JDK 9 到 JDK 16 中使用反射调用JDK 内部Api。您可以指定以下参数: --illegal-access=permit: 允许类路径上的代码反映java.*JDK 8 中存在的包的内部结构。对任何此类元素的第一次反射访问操作会导致发出警告,但在此之后不会发出警告。 --illegal-access=warn:导致为每个非法反射访问操作发出警告消息。 --illegal-access=debug: 导致为每个非法反射访问操作显示警告消息和堆栈跟踪。 --illegal-access=deny: 禁用所有非法反射访问操作,但由其他命令行选项启用的操作除外,例如 --add-opens.
  许多工具和库已更新以避免依赖 JDK 内部Api,而是使用在 JDK 8 和 17 之间引入的标准 Java API。同时--illegal-access启动选项在 JDK 17 中已过时。在 JDK 17 中使用此启动器选项,无论是使用permit, warn,debug或deny, 除了发出警告消息外没有任何作用。
  如果您无法获取或部署较新版本的工具和库,则有两个命令行选项可让您授予对旧版本工具和库的特定内部 API 的访问权限: --add-exports:如果您有一个较旧的工具或库需要使用已被强封装的内部 API,则使用 --add-exports运行时选项。您还可以 --add-exports在编译时使用来访问内部 API。 --add-opensjava.*:如果您有一个较旧的工具或库需要通过反射访问 API 的非public字段和非public方法,请使用该--add-opens选项。
  请参阅JEP 403:默认情况下强封装 JDK 内部。
  --add-exports
  如果您有一个较旧的工具或库需要使用已被强封装的内部 API,请使用 --add-exports运行时选项。您还可以--add-exports在编译时使用来访问内部 API。
  该--add-exports选项的语法是:
  --add-exports /=(,)*
  其中   和   是模块名称,  是包的名称。
  --add-exports如果目标模块读取源模块, 该选项允许目标模块中的代码访问源模块的命名包中的类型。
  作为一种特殊情况,如果  是 ALL-UNNAMED,则源包将导出到所有未命名的模块,无论它们最初存在还是稍后创建。例如:
  --add-exports java.management/sun.management=ALL-UNNAMED
  此示例允许所有未命名模块中的代码(类路径上的代码)访问 java.management/sun.management。
  如果类路径上的代码使用反射 API ( setAccessible(true)  ) 尝试访问java.*API 的非公共字段和方法,则代码将失败。默认情况下,JDK 17 不允许这样做。但是,您可以使用该 --add-opens选项来允许这样做。有关更多信息,请参见--add-opens部分。
  如果在类路径上运行的应用程序oldApp必须使用模块的未导出com.sun.jmx.remote.internal包java.management,则可以通过以下方式授予它所需的访问权限:
  --add-exports java.management/com.sun.jmx.remote.internal=ALL-UNNAMED
  您还可以使用Add-ExportsJAR 文件清单属性:
  Add-Exports:java.management/sun.management
  谨慎使用该--add-exports选项。您可以使用它来访问库模块甚至 JDK 本身的内部 API,但这样做的风险由您自己承担。如果该内部 API 更改或被删除,那么您的库或应用程序将失败。
  参见JEP 261:模块系统。
  --add-opens
  一些工具和库使用反射 API ( setAccessible(true)  ) 尝试访问java.*API 的非公共字段和方法。默认情况下,这在 JDK 17 上不再可能,但您可以使用--add-opens命令行上的选项为特定工具和库启用它。
  --add-opens语法如下:
  --add-opens /=(,)*
  无论模块声明如何, 此选项都允许  打开  给 。
  作为一种特殊情况,如果   是ALL-UNNAMED,则源包将导出到所有未命名的模块,无论它们最初存在还是稍后创建。例如:
  --add-opens java.management/sun.management=ALL-UNNAMED
  此示例允许类路径上的所有代码访问java.management/sun.management包中公共类型的非公共成员。 新版本字符串方案
  JDK 10 对 JDK 9 中引入的版本字符串方案引入了一些小的更改,以更好地适应基于时间的发布模型。JDK 11 及更高版本保留了 JDK 10 中引入的版本字符串格式。
  如果您的代码依赖于版本字符串格式来区分主要、次要、安全和补丁更新版本,那么您可能需要更新它。
  新版本字符串的格式为:
  $FEATURE.$INTERIM.$UPDATE.$PATCH
  添加了用于解析、验证和比较版本字符串的简单 Java API。看java.lang.Runtime.Version.
  请参阅Java 平台中的版本字符串格式 ,标准版安装指南 。
  有关 JDK 9 中引入的版本字符串的更改,请参阅 JEP 223:新版本字符串方案。
  有关 JDK 10 中引入的版本字符串更改,请参阅JEP 322: Time-Based Release Versioning。 已安装的 JDK/JRE 映像的更改
  对 JDK 和 JRE 进行了重大更改。 更改了 JDK 和 JRE 布局
  安装 JDK 后,如果查看文件系统,您会注意到目录布局与 JDK 9 之前的版本不同。
  JDK 11 及更高版本
  JDK 11 及更高版本没有 JRE 映像。请参阅Java 平台中 JDK的已安装目录结构 ,标准版安装指南 。
  DK 9 和 JDK 10
  以前的版本有两种类型的运行时映像:JRE,它是 Java SE 平台的完整实现,以及 JDK,它将整个 JRE 包含在一个jre/目录中,以及开发工具和库。
  在 JDK 9 和 JDK 10 中,JDK 和 JRE 是两种类型的模块化运行时映像,包含以下目录: bin : 包含二进制可执行文件。 conf : 包含.properties、.policy和其他类型的文件,供开发人员、部署人员和最终用户编辑。这些文件以前在lib目录或其子目录中找到。 lib : 包含动态链接的库和 JDK 的完整内部实现。
  在 JDK 9 和 JDK 10 中,仍然有单独的 JDK 和 JRE 下载,但每个都有相同的目录结构。JDK 映像包含历史上在 JDK 中发现的额外工具和库。没有jdk/与jre/包装器目录,并且二进制文件(例如java命令)不重复。
  请参阅JEP 220:模块化运行时映像。 新的类加载器实现
  JDK 9 和更高版本维护了自 1.2 版本以来存在的类加载器的层次结构。但是,为了实现模块系统,进行了以下更改: 应用程序类加载器不再是URLClassLoader而是一个内部类。它是既不是 Java SE 也不是 JDK 模块的模块中的类的默认加载器。 扩展类加载器已重命名;它现在是平台类加载器。Java SE 平台中的所有类都保证通过平台类加载器可见。 仅仅因为一个类通过平台类加载器可见并不意味着该类实际上是由平台类加载器定义的。Java SE 平台中的一些类是由平台类加载器定义的,而其他类是由引导类加载器定义的。应用程序不应依赖于哪个类加载器定义了哪个平台类。 在 JDK 9 中实现的更改可能会影响创建类加载null器(即引导类加载器)作为父类加载器并假定所有平台类对父类可见的代码。可能需要更改此类代码以使用平台类加载器作为父级(请参阅 ClassLoader.getPlatformClassLoader)。 平台类加载器不是URLClassLoader,而是一个内部类。 引导类加载器仍然内置在 Java 虚拟机null中,由ClassLoaderAPI。它定义了一些关键模块中的类,例如java.base. 因此,它定义的类远少于 JDK 8 中的类,因此部署-Xbootclasspath/a或创建类加载null器作为父级的应用程序可能需要如前所述进行更改。 删除了 rt.jar 和 tools.jar
  以前存储在lib/rt.jar、lib/tools.jar中的类和资源文件lib/dt.jar以及各种其他内部 JAR 文件以更有效的格式存储在lib目录中特定于实现的文件中。
  删除rt.jar和类似文件会导致以下方面的问题: 从 JDK 9 开始,ClassLoader.getSystemResource不返回指向 JAR 文件的 URL(因为没有 JAR 文件)。相反,它返回一个 jrtURL,该 URL 命名存储在运行时映像中的模块、类和资源,而不显示映像的内部结构或格式。
  例如:
  ClassLoader.getSystemResource("java/lang/Class.class");
  在 JDK 8 上运行时,此方法返回以下形式的 JAR URL:
  jar:file:/usr/local/jdk8/jre/lib/rt.jar!/java/lang/Class.class
  模块化的镜像(modular image)不包含任何 JAR 文件,因此这种形式的 URL 没有意义。在 JDK 9 及更高版本上,此方法返回:
  jrt:/java.base/java/lang/Class.class
  java.security.CodeSource  API 和安全策略文件使用 URL 来命名要被授予特定权限的代码库的位置。请参阅 Java 平台 中的策略文件语法,标准版安全开发人员指南。运行时组件需要的特定权限当前使用文件URL的方式定义在conf/security/java.policy文件中(Components of the runtime system that require specific permissions are currently identified in the conf/security/java.policy file by using file URLs) 。 旧版本的 IDE 和其他开发工具需要能够枚举存储在运行时映像中的类和资源文件,并通过打开和读取rt.jar类似文件来直接读取它们的内容。这对于模块化镜像是不可能的。 移除了扩展机制
  在 JDK 8 及更早版本中,扩展机制使运行时环境可以查找和加载扩展类,而无需在类路径上专门命名它们。从 JDK 9 开始,如果您需要使用扩展类,请确保 JAR 文件位于类路径上。
  在 JDK 9 和 JDK 10 中,如果设置了系统属性或目录存在,javac编译器和java 启动器将退出。要另外检查特定于平台的系统范围目录,请指定 命令行选项。如果目录存在且不为空,这将导致发生相同的退出行为。扩展类加载器保留在 JDK 9(及更高版本)中,并被指定为平台类加载器(参见java.ext.dirslib/ext-XX:+CheckEndorsedAndExtDirsgetPlatformClassLoader.) 但是,在 JDK 11 中,此选项已过时,使用时会发出警告。
  以下错误表示您的系统配置为使用扩展机制:
  /lib/ext exists, extensions mechanism no longer supported; Use -classpath instead. .Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
  如果设置了java.ext.dirs系统属性, 您将看到类似的错误。
  要修复此错误,请删除ext/目录或java.ext.dirs系统属性。
  请参阅JEP 220:模块化运行时映像。 删除了经认可的标准覆盖机制
  java.endorsed.dirs系统属性和lib/endorsed目录将不再存在。如果检测到任何一个,编译器和启动器将退出javac。java
  从 JDK 9 开始,您可以使用可升级模块或将 JAR 文件放在类路径中实现类似功能。
  此机制旨在让应用程序服务器覆盖 JDK 中使用的组件。要更新的包将被放入 JAR 文件中,系统属性java.endorsed.dirs会告诉 Java 运行时环境在哪里可以找到它们。如果未指定此属性的值,则使用默认值$JAVA_HOME/lib/endorsed。
  在 JDK 8 中,您可以使用-XX:+CheckEndorsedAndExtDirs命令行参数来检查系统上任何位置的此类目录。
  在 JDK 9 及更高版本中,如果设置了java.endorsed.dirs系统属性或lib/endorsed目录存在 ,javac编译器和java启动器将退出。
  以下错误意味着您的系统配置为使用认可的标准覆盖机制:
  /lib/endorsed is not supported. Endorsed standards and standalone APIs in modular form will be supported via the concept of upgradeable modules. Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
  如果设置了java.endorsed.dirs系统属性, 您将看到类似的错误。
  要修复此错误,请删除lib/endorsed目录或取消设置java.endorsed.dirs系统属性。
  请参阅JEP 220:模块化运行时映像。 删除了 macOS 特定的功能
  从 JDK 9 开始删除了macOS 特定功能。 特定于平台的桌面功能
  该类包含对 Apple 特定的和包java.awt.Desktop中 API 的替换。新的 API 取代了 macOS API,并且独立于具体操作系统。 com.apple.eawtcom.apple.eio
  com.apple.eawt和包中的 APIcom.apple.eio是封装的,因此您将无法在 JDK 9 或更高版本中针对它们进行编译。但是,它们在运行时仍可访问,因此编译为旧版本的现有代码继续运行。apple最终,使用andcom.apple 包及其子包 中的内部类的库或应用程序 将需要迁移到新的 API。
  com.apple.concurrent 和包被删除,apple.applescript没有任何替换。
  请参阅JEP 272:特定于平台的桌面功能。 移除 AppleScript 引擎
  AppleScript 引擎,特定于平台的javax.script实现,已在 JDK 中删除,没有任何替换。
  AppleScript 引擎在最近的版本中几乎无法使用。该功能仅在 JDK 7 或 JDK 8 中有效,系统上已经有 Apple 版本的AppleScriptEngine.jar文件。 Windows 注册表项更改
  Java 11 及更高版本的安装程序会在安装 JDK 时创建 Windows 注册表项。对于 JDK 16,安装程序会创建以下 Windows 注册表项: "HKEY_LOCAL_MACHINESOFTWAREJavaSoftJDK" "HKEY_LOCAL_MACHINESOFTWAREJavaSoftJDK16"
  如果安装了两个版本的 JDK,则会创建两个不同的 Windows 注册表项。例如,如果 JDK 15.0.1 与 JDK 16 一起安装,则安装程序会创建另一个 Windows 注册表项,如下所示: "HKEY_LOCAL_MACHINESOFTWAREJavaSoftJDK" "HKEY_LOCAL_MACHINESOFTWAREJavaSoftJDK16" "HKEY_LOCAL_MACHINESOFTWAREJavaSoftJDK15.0.1" 部署
  Java 部署技术在 JDK 9 中被弃用,并在 JDK 11 中被删除。
  Java Applet 和 WebStart 功能,包括 Applet API、Java 插件、Java Applet 查看器、JNLP 和 Java Web Start(包括 javaws 工具)在 JDK 9 中均已弃用
  使用jlinkJDK 9 引入的工具来打包和部署专用运行时,而不是依赖于预安装的系统 JRE。
  删除了启动时 JRE 版本选择功能
  从 JDK 9 开始,删除了请求不是在启动时启动的 JRE 的 JRE 版本的能力。
  现代应用程序通常使用 Java Web Start (JNLP)、本机 OS 打包系统或活动安装程序进行部署。这些技术有自己的方法来管理所需的 JRE,方法是根据需要查找或下载和更新所需的 JRE。这使得启动器的启动时可以选择已过时JRE 版本。
  在以前的版本中,您可以指定启动应用程序时要使用的 JRE 版本(或版本范围)。可以通过命令行选项和应用程序 JAR 文件中的清单条目来选择版本。
  从 JDK 9 开始,java launcher 修改如下: -version:如果在命令行上给出 了选项,则发出错误消息并退出。 JRE-Version如果在 JAR 文件中找到清单条目 ,则发出警告消息并继续。
  请参阅JEP 231:删除启动时 JRE 版本选择。 垃圾收集的变化将 G1 设为默认垃圾收集器删除了部分GC 选项
  以下 GC 组合将导致您的应用程序在 JDK 9 及更高版本中无法启动: DefNew + CMS ParNew + SerialOld Incremental CMS
  CMS 的前台模式也已被删除。删除的命令行标志是-Xincgc、-XX:+CMSIncrementalMode、 -XX:+UseCMSCompactAtFullCollection、-XX:+CMSFullGCsBeforeCompaction和 -XX:+UseCMSCollectionPassing。
  命令行标志-XX:+UseParNewGC不再有效。该ParNew标志只能用于 CMS 和 CMS 需要ParNew。因此,该-XX:+UseParNewGC标志已被弃用,并且在未来的版本中删除。
  请参阅JEP 214:删除 JDK 8 中已弃用的 GC 组合。
  删除了永久代
  JDK 8 中删除了永久代,相关的 VM 选项会导致打印警告。您应该从脚本中删除这些选项: -XX:MaxPermSize= size -XX:PermSize= size
  在 JDK 9 及更高版本中,JVM 会显示如下警告:
  Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
  使用了永久代参数的工具可能必须更新。
  请参阅JEP 122:删除永久代和JDK 9 发行说明 - 删除的 API、功能和选项。 GC 日志输出的更改
  垃圾收集(GC)日志使用JVM统一的日志框架,新旧日志存在一些差异。您正在使用的任何 GC 日志解析器都可能需要更改。
  您可能还需要更新 JVM 日志记录选项。所有与 GC 相关的日志记录都应使用 gc标签(例如—Xlog:gc),通常与其他标签结合使用。和选项已被弃用 —XX:+PrintGCDetails。-XX:+PrintGC
  请参阅 Java Development Kit Tool Specifications 和JEP 271: Unified GC Logging中的使用 JVM Unified Logging Framework 启用日志记录。 正则表达式匹配中的行为变化
  java.util.regex.Pattern用方括号定义正则表达式中的字符类。例如,[abc] 匹配a,b,或c。否定字符类是用紧跟在左大括号后面的插入符号定义的。例如, [^abc]匹配除a,b, 或之外的任何字符c。
  在 JDK 8 及更早版本中,否定字符类不会否定嵌套字符类。例如,[^a-b[c-d]e-f]匹配 c但不匹配a,或者 e因为它们不在嵌套类中。运算符一个接一个地应用。^在此示例中,在嵌套之前应用了否定运算符。在 JDK 8 及更早的版本中,运算符^仅应用于字符类中的最外层字符, 而不应用于 到嵌套的字符类。这种行为令人困惑且难以理解。
  但是,在 JDK 9 及更高版本中,否定运算符应用于所有嵌套字符类。例如, [^a-b[c-d]e-f]不匹配 c。
  为了进一步解释,请考虑以下正则表达式:
  [^a-d&&c-f]
  在 JDK 8 中,^首先应用运算符,因此该示例被解释为 [^a-d] 与[c-f]. 这匹配 e and f但不 匹配a, b, c, or d。
  在 JDK 9 及更高版本中,&&首先应用运算符,因此该示例被解释为[a-d]&&[c-f]. 这匹配 a, b,e和f但不匹配c or d。
  作为最佳实践,寻找使用字符类的正则表达式以及否定、交集和嵌套类的某种组合。可能需要调整这些正则表达式以考虑更改的行为。
  后续步骤如果需要,使用javac工具 -–release中的新标志交叉编译到平台的旧版本 。 利用 IDE 的建议来使用最新功能更新代码。 通过运行静态分析工具jdeprscan查看您的代码是否使用了已弃用的 API 。正如本指南中已经提到的,可以从 JDK 中删除 API,但必须提前通知。 熟悉多版本 JAR 文件等新功能(请参阅jar)。 实战目标
  使用JDK 17 构建hutool,新建springboot工程并调用JDK 17调用hutool中的功能。 步骤
  先用JDK 17直接构建,修改pom.xml,将JDK版本修改为17
  首先确保已经安装配置好JDK 17:这里使用了更高版本的19
  运行mvn clean compile进行编译
  编译失败,因为javax.xml包已经被移除。
  在hutool-core/pom.xml中添加javax.xml的依赖
  javax.xml.bind jaxb-api 2.3.0   com.sun.xml.bind jaxb-core 2.3.0   com.sun.xml.bind jaxb-impl 2.3.0
  重新编译,全部编译成功
  执行mvn install -Dmaven.javadoc.skip=true 执行单元测试并本地安装hutool,执行单元测试在这里很重要,因为不能保证升级JDK之后,代码逻辑不受影响。
  对于Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @5a65309b 错误,明显是因为Java 9开始的模块系统强封装造成的,我们需要添加--add-exports。
  org.apache.maven.plugins maven-surefire-plugin  --add-opens java.base/java.lang=ALL-UNNAMED
  添加上面插件和配置之后,java.lang.CloneNotSupportedException不再出现,现在来处理java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached。这个错误是因为要创建的线程数超过了系统的限制,调大即可。
  解决这个错误之后,出现module java.base does not "opens java.util.regex" to unnamed module @15615099
  继续添加opens
  出现新的错误,这是因为JDK移除了javax.activation,添加依赖就好
  添加如下依赖
  出现新的错误java.lang.NoSuchFieldException: modifiers
  因为JDK 12开始,field字段不再有modifiers,所以更改代码以满足要求
  再次重新构建,出现新的错误
  添加opens:
  再次构建,出现如下错误
  debug之后发现,这个错误是因为高版本jdk使用MemberName来判断field的modifier,让前面代码中修改失败,所以只能先暂时跳过这个测试并不使用这个功能,等待项目组更新版本支持高版本JDK。
  至此构建全部成功
  新建SpringBoot工程
  引入之前构建在本地的hutool
  编写一个简单的测试类:
  @RestController public class TestController { @GetMapping("/test/{plainText}") public ResponseEntity test(@PathVariable("plainText") String plainText) { int hash = HashUtil.apHash(plainText); return ResponseEntity.ok(hash); } }
  启动应用进行测试:

1分险胜澳大利亚,中国女篮能重现28年前的神奇吗?极目新闻记者徐平北京时间9月30日下午5点半,在2022年女篮世界杯半决赛上,中国女篮将面对东道主澳大利亚队。值得一提的是,在1994年,中国女篮正是在世锦赛(世界杯的前身)的半决李梦官宣高烧,谁注意对阵法国退场后这细节?教练给其披上羽绒服今天李梦官宣高烧,这一切都是让人震惊的。当然官方也给予了明确的回应,一方面是因为李梦世界杯太疲惫,造成免疫力下滑。同时李梦在昨天就已经出现发烧的情况,不过在这种情况下李梦依然砍下了一日三餐,早餐最为重要!建议多吃这6样,营养又健康老人们常说,一日三餐,早餐最为重要。由于现在生活节奏加快,大多数年轻人,尤其是上班族,早晨为了多睡5分钟,随便买个路边摊垫几口就了事了。还有一些人,他们觉得不吃早餐可以减少热量,有难说再见期待重逢冰墩墩雪容融实体销售下线倒计时新华社北京9月30日电(记者姬烨李春宇)按照特许经营协议,9月30日是北京2022年冬奥会和冬残奥会特许商品线下零售店营业的最后一天。虽然天猫平台奥林匹克官方旗舰店将持续销售到今年搞笑妹!全红婵戴假发拍广告,趴师姐肩头装淑女,抱2大桶爆米花开怀9月30日消息,日前,中国跳水队15岁奥运冠军全红婵和队友参加了广告的拍摄,红姐依然是搞笑担当,和师姐昌雅妮陈芋汐成为三个活宝。日前,跳水队一位工作人员在社交媒体上晒出了给队员们拍河南4道下酒绝菜,那真叫香,自家做简单易上手,每顿多喝二两酒好酒好菜,夫复何求!河南菜虽然不在中国四大菜系当中,但是爱喝酒的河南人,下酒菜做得还是很地道的,今天闲话不多讲,直接分享河南非常地道的四道下酒菜和一款美酒给各位,国庆建议就地过节,可穿戴设备的出货量暴跌,各大厂商该怎样面对?华为自从被美国制裁以后,在国际市场上的份额占比就持续下滑,所以可穿戴产品就逐渐成为了华为的底牌之一。近期,华为更是推出了Mate50准备和苹果14来一次正面硬刚。除此之外,华为的目农业科技现代化成为农业现代化的强劲引擎来源科技日报智能农机在田野里奔腾辗转,自动播种施肥收割,却不见一人指尖在屏上轻轻一点,旅行之余也可以给大棚里的蔬菜浇水施肥没有土壤,没有阳光,植物工厂里的蔬菜依然长得旺盛科技与农业亚马逊创始人贝索斯前妻再度离婚,财产分割细节未公开来源环球时报环球时报综合报道亚马逊创始人贝索斯的前妻麦肯齐斯科特已申请和她第二任丈夫丹朱伊特离婚。据美国纽约时报28日报道,周一,斯科特向华盛顿州金县高等法院提交了离婚申请,法庭记李沁也太有少女感了吧,穿牛仔外套配超短裙,大长腿十分吸睛秋风萧瑟的季节里,小姐姐们都穿上了各式各样的裙子,这时候你一定要给自己安排上一件牛仔外套,穿起来休闲简约,修饰身材的效果还挺好的,而且牛仔外套款式很多,像李沁用牛仔外套搭配上了一条国庆健康指南,值得全家收藏秋高气爽丹桂飘香,国庆节的脚步日益临近。每逢假期,因饮食无度起居无常造成的健康问题,正在困扰着越来越多的朋友。假期即将开启,我们的健康问题不容忽视。饮食有度不论何时,健康饮食的大原
祖国,到底是什么?一条大河波浪宽,风吹稻花香两岸,我家就在岸上住,听惯了艄公的号子,看惯了船上的白帆。这是乔羽作词的歌曲我的祖国,这几句歌词没有一句提到祖国,却句句都能让我们想起祖国,想起这片养育我祖国颂2022年国庆节,阳光斑斓,微风含香。华夏儿女热血沸腾心潮澎湃,共情共悦共祝祖国73岁华诞,所到之处皆为笑脸,所走之地皆为欢歌。红旗飘飘皆为华夏信仰,鲜花绽放同筑神州忠魂。忆往昔,中国科学家揭开了宇宙之谜中国科学家青岛科技大学张永恒教授经过数十年的研究,成功提出物能时空理论。什么是物质,什么是能量,什么是时间,什么是空间。它们之间有什么联系呢?物能时空理论认为物质具有无限低的不对称新证据表明火星南极冰盖下有液态水据发表在最新一期自然天文学杂志上的论文,一个国际研究小组利用雷达以外的数据提供了首个独立的证据,证明火星南极冰盖下存在液态水。由英国剑桥大学领导的研究小组使用航天器激光高度计测量冰古鱼身上的秘密五种志留纪古鱼类新属种的艺术复原图,从上到下分别为蠕纹沈氏棘鱼新塑梵净山鱼双列黔齿鱼灵动土家鱼和奇迹秀山鱼。(中科院古脊椎所供图图)生命的起源和演化是当代科学的重大课题之一,其中脊我们这十年坐标中国深空测控系统捕捉太空的声音来源人民网目尽星河远,连通天地间。在中国东北西部边陲的土地上,在南美巴塔哥尼亚高原上,一面面巨大的深空天线正向着浩瀚无垠的宇宙向着遥远未知的火星接力工作,日夜探索2012年6月,神火星浅表是何结构?是否存在水?中国科学家探火研究又有新发现火星在演化上被认为代表着地球未来,因此针对火星的相关探测研究长期以来备受关注。火星浅表是怎样的结构?是否存在固态或液态的水?火星地质经历了什么样的演化过程?科学家和大众对这些问题都明查美国制片人自曝伪造阿波罗11号登月场景?速览网传美国电影制片人自曝伪造美国登月场景的言论来自一部叫拍摄斯坦利库布里克的伪纪录片式电影。电影中的库布里克由演员扮演,所谓的自曝是经过设计的表演,自曝的内容是台词而非库布里克真华硕新款猎鹰A5一体机上架搭载i511500B,背面有小屏IT之家10月1日消息,今年8月份,华硕在海外推出了新款ExpertCenterE5一体机,搭载了11代酷睿B系列处理器。现在,这款猎鹰A5一体机已经在天猫上架,搭载i511500DIY电脑如何挑选适合自己的显卡?对于第一次组装电脑或者对显卡了解不是很多的人,建议大家点击链接先了解一下显卡的基础知识一AMD还是英伟达?独立显卡的核心技术主要由NVIDIA和AMD两大巨头掌控,其他的OEM厂商我的祝福在飞扬的时光里喜迎国庆,把最美好的祝福献给祖国73岁华诞!祝朋友们节日快乐!盘锦宝奶诗当你我还沉醉在秋韵鲜花盛开的九月,十月披着金色的霞辉落满斑斓的走来,喜迎伟大祖国73岁华诞!十月的天空绚丽蔚比特币是否会纳入监管?纵观全球市场,此时美国正在经历前所未有的通胀,美元指数虽然一路飙升,但是通胀情况一直没有得到缓解,全球市场除了能源以外一片哀鸿遍野。欧洲更不必说,此时北溪二号被人为破坏,具体是谁我江苏一条重量级高速铁路开工,弄了一场别开生面的开工仪式江苏在2021年实现经济总量116364。2亿元,非常强大的存在,实力仅次于广东,而江苏管辖下的十三座地级市都入围我国百强市,被认为是发展最为平衡的一个省。然而也因江苏管辖下的十三Windows11系统的优缺点目前的Windows11产品还处于一个新生系统的层面,首先新颖简洁的画面映入眼帘确实好看了不少,比如说窗口,圆角,图标以及拖拽时的动画效果,确实是可圈可点。任务栏的图标位置发生了改我们这十年坐标中国深空测控系统捕捉太空的声音原标题我们这十年坐标中国深空测控系统捕捉太空的声音目尽星河远,连通天地间。在中国东北西部边陲的土地上,在南美巴塔哥尼亚高原上,一面面巨大的深空天线正向着浩瀚无垠的宇宙向着遥远未知的GPS成过去?百度地图官宣优先北斗系统定位有关卫星导航系统的较量,可谓越来越精彩了。在苹果iPhone14华为Mate50系列智能手机先后宣布支持GPS和北斗卫星通讯后,百度地图也官宣切换为优先运用北斗系统进行定位。同时百退场时劳伦杰克逊偶遇姚明,这次不再主动,她只是偷瞄了几眼后者中国女篮半决赛的对手是东道主是澳大利亚,而这场比赛除了胜负比较受人关注外,41岁的劳伦杰克逊也成为焦点之一,因为她与姚明有关一段绯闻。这件事就要到08年的北京奥运会说起了,当时闭幕17比25!22比25!女排1比3遭逆转,一传堪称灾难,蔡斌换人背大锅17比25!22比25!女排1比3遭逆转,一传堪称灾难,蔡斌换人背大锅中国女排迎来世锦赛小组赛的最后一个对手,排名世界第二的巴西队。由于在昨天比赛中,巴西爆冷不敌日本队,因此这场比中国女排不敌巴西,李盈莹独木难支,王唯漪成为全场败笔2022女排世锦赛小组赛最后一轮,中国女排迎来了巴西女排,此前巴西女排13不敌日本。中国女排派出的首发阵容为主攻李盈莹和王云蕗,副攻王媛媛和袁心玥,二传刁琳宇,接应龚翔宇,自由人王袁心玥作为队长,就要在队伍困难时站出来新华社荷兰阿纳姆9月30日电(记者肖亚卓刘旸)中国女排在2022世界女排锦标赛第一阶段小组赛取得四连胜,袁心玥30日表示,作为队长她要肩负起更大的责任。中国女排当天以30击败捷克队从被围猎到统治世界,中国光伏行业做对了什么?作者通威传媒考拉看看字数5000文章来源聚焦与余光微信公众号,InsightABC中国光伏如何从一地鸡毛走向全球领先?其中遭遇了怎样的跌宕起伏?发展光伏对于提前实现双碳目标保证能源外星人真的存在?美国一女子称来自1874年,被外星人抓走做实验综述传说中的星际穿越真的存在吗?在浩渺的宇宙当中是否真有其他外星生命呢?一直以来,人类都在不断的研究和摸索,企图发现外星生命的存在,可由于技术受限,一直没能找到关键的突破点,但是在