Java是向后兼容的,但是为什么jdk从1.6升级到1.8时需要升级很多库呢?

2023-11-22

近期我们升级了Jdk版本1.6 to 1.8在我的一个 Java 项目中。但有一些编译或运行时错误,所以我必须升级一些库:

  • gradle: 1.9 to 1.10
  • spring: 3.x to 4.x

这是因为他们使用的是 ASM 的一些早期版本,但仅支持 jdk 1.85.x

Java说是向下兼容的,但是为什么原来版本的库不能直接使用jdk 1.8呢?


ASM 是一个相当低级的库。

它直接处理 Java 字节码(而“普通”应用程序只会让 JVM 加载其类)。字节码格式会不时发生变化,较旧的 JVM 无法使用较新的版本。

向后兼容性不包括对 JDK 或类格式内部的破坏。

这确实是一种边缘情况,ASM 几乎是唯一“流行”的例子。


更重要(也更常见)的是系统库代码的轻微行为变化。因此,您的应用程序在技术上仍然可以运行,但会以不同的方式执行操作。大多数时候,您希望如此,因为这意味着改进(例如更好的性能),但有时它可能会给您带来错误。

例如:

  • 切换到 64 位 JVM 可以需要更多内存
  • 垃圾收集的变化可能会导致意外的暂停
  • 将 XML 解析器包含到 JDK 中需要更改 Web 应用程序打包或配置
  • String#substring 的内存和运行时特性在“次要”JDK 修订中完全改变
  • 突然使用自定义(未正确实现)比较器对集合进行排序抛出异常它之前没有抛出
  • 从 Java 8 开始,调用 Thread#stop(Throwable) (这从来都不是一个好主意,并且已被弃用很长一段时间)会抛出 UnsupportedOperationException
  • 更新了 Unicode 支持更改某些字符串的排序和大小写行为
  • 改变在泛型编译
  • 由于新的默认方法,无法扩展 BitSet 并实现 Set
  • 舍入行为的变化
  • 还有许多其他人API 和 BPI 的变化

但总而言之,Java 的遗留应用程序兼容性非常好。他们必须让所有企业客户牢记这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java是向后兼容的,但是为什么jdk从1.6升级到1.8时需要升级很多库呢? 的相关文章

随机推荐

  • Twig_Error_Syntax 表示“未知过滤器”,在 Timber 中带有 Twig 过滤器

    这一定很简单 但我看不出有什么问题 我正在使用简单的过滤器示例https twig symfony com doc 1 x advanced html filters使用 Timber 中的 Twig 1 34 这是一个 WordPress
  • 如何使用 Android 版 Glide 压缩和降低图像质量

    我正在使用 Glide 库上传图像 在另一个应用程序中 我使用此代码 void imageButtonclick iv1 setOnClickListener new View OnClickListener Override public
  • 在分页函数中使用 limit 参数

    是否可以在 paginate 函数中使用 limit 参数 我正在尝试这个 users gt where gt limit 50 gt paginate page 现在 如果数据库中有 100 个用户 那么 paginate 函数的响应将是
  • Android HILT SingletonComponent 与 GoF Singleton 实例设计模式

    在 Android 项目中 有一个外观作为单例实现 我认为使用 HILT SingletonComponent 将其转换为 DI 是一个更好的主意 Module InstallIn SingletonComponent class obje
  • 获取 WindowRef 的边界?

    我正在尝试找到一个 Carbon API 它可以从窗口 id 中为我提供 WindowRef 并且通过该 windowref 我想要有边界吗 编辑 我找到了API extern WindowRef HIWindowFromCGWindowI
  • Skylake L2 缓存通过减少关联性增强?

    In 英特尔的优化指南在第 2 1 3 节中 他们列出了 Skylake 中缓存和内存子系统的许多增强功能 重点是我的 Skylake微架构的缓存层次结构有以下 增强功能 与前几代相比 缓存带宽更高 通过扩大的缓冲区可以同时处理更多的负载和
  • 有什么区别stdint h and cstdint 它们都可以在 MSVC Visual Studio 2010 和 gcc 4 5 1 中使用 并且两者都定义了intX t uintX t类型 其中X是类型的大小 以位为单位 如果两个标头
  • 正则表达式包括结果中应该是非捕获组的内容

    我有以下简单的测试 我试图获取正则表达式模式 以便它提取不带 exe 后缀的可执行文件名称 看来我的非捕获组设置 exe 不起作用或者我误解了它的工作原理 Both regex101 and 正则风暴网显示相同的结果 前者确认 exe 是非
  • 了解 SpriteKit CollisionBitMask

    我正在学习使用SpriteKit我正在遵循碰撞教程 我很难理解以下代码 struct PhysicsCategory static let None UInt32 0 static let All UInt32 UInt32 max sta
  • 在运行时覆盖 __setattr__

    我知道在 Python 中可以在运行时向类添加方法 class Test def init self self a 5 test Test import types def foo self print self a test foo ty
  • 迭代 numpy 数组的前 d 轴

    我得到了一个具有任意数量轴的数组 我想迭代它们 比如其中的第一个 d 我该怎么做呢 最初我想我会创建一个包含我想要循环的所有索引的数组 使用 i np indices a shape d indices np transpose np as
  • 在 C/C++ 中加密文本文件的最佳方法是什么?

    只要用户登录 基于 C C 的 cgi Web 应用程序就会在服务器上创建一个临时文本文件 当用户注销时 该文本文件将被删除 我想加密这个文本文件以及文件的内容 该文件将包含用户名和密码等信息 做这个的最好方式是什么 编辑 我看到有人建议图
  • UIWebBrowserView 不跨越整个 UIWebView

    所以我一直在尝试让这个简单的行为在我的 iPhone 应用程序上运行一段时间 我的顶部有一个导航栏 底部有一个标签栏 我正在将所有内容加载到网络视图中 我希望将其放在两者之间 我已经发帖讨论过这个问题两次了 都在这里 IOS 视图仍然没有加
  • 在 Bash 中将波形符回显到文件而不扩展它

    我需要在 Bash 脚本中向文件写入一个参数 所以我正在做这样的事情 echo Argument is 1 gt gt file 问题是 如果参数中有波形符 我不希望它扩展到主目录 因此 如果用户将 bin 作为参数传递给脚本 它将被写为
  • Win32 套接字 - 在发送到其他本地接口时强制 ip 数据包离开物理接口

    摘要 我正在尝试创建套接字以在同一台计算机上存在的两个物理接口之间传递数据 并且 Win32 套接字始终直接在内核中转发流量 而不是通过物理接口推送 有什么方法可以禁用此行为 也许可以通过设备设置 注册表调整 路由表恶作剧或套接字选项 我们
  • 创建针对 Monodroid 的 PCL

    我正在查看闪亮的 MVVMCross 项目 特别是N 1天MVVMCross系列 我注意到 slodge 创建了一个针对 Android 的 Mono 和 Monotouch 的 PCL 1 10 我安装了适用于 Android 的 mon
  • 如何将控制台输出重定向到文本文件

    我正在执行一个 Perl 程序 无论我的控制台上打印什么 我都想重定向 到一个文本文件 首选方法是通过命令行处理重定向 例如 perl w my program pl gt my output txt 如果你还想包含 stderr 输出 那
  • 数据文件中的字段超出最大长度 - 错误

    当我尝试将数据插入到指定大小的列中时varchar2 4000 在表中我收到错误为 Field in data file exceeds maximum length 数据 1 2 3 4 5 6 7 8 9 10 11 12 13 15
  • Android:如何在 CSV 文件中写入换行符?

    我正在尝试在 CSV 文件中组织我的数据 我想将我的数据放入特定行 因此我尝试放入 n 但它不起作用 请帮助我将数据放入特定行 谢谢进步 public void writeData String data String strFilePat
  • Java是向后兼容的,但是为什么jdk从1.6升级到1.8时需要升级很多库呢?

    近期我们升级了Jdk版本1 6 to 1 8在我的一个 Java 项目中 但有一些编译或运行时错误 所以我必须升级一些库 gradle 1 9 to 1 10 spring 3 x to 4 x 这是因为他们使用的是 ASM 的一些早期版本