文章目录
  1. 1. 1. Mixin配置属性minVersion
    1. 1.1. 1.1 Mixin关于向后兼容性的一般约定
    2. 1.2. 1.2 使用构建脚本编写minVersion
  2. 2. 2. Mixin配置属性compatibilityLevel

本文翻译自:PSA Forward Compatibility Features in Mixin

Mixin包含许多特性和设计考量,不仅旨在提供向后兼容性,还致力于解决前向兼容性问题。由于这些特性的用途可能不太明显,我将在此详细说明。不过,本篇PSA的重点在于Mixin配置中minVersion键的使用,以及其对应用程序稳定性的影响。

1. Mixin配置属性minVersion

minVersion属性是您可用的最重要的前向兼容性基础设施,不应被忽视。使用minVersion属性的安全做法是始终将其设置为您构建时所用的Mixin版本。但是,如果您没有使用构建版本中的特性,手动维护该值可以提供更大的灵活性。

那么minVersion键有什么作用呢?

假设有两个库ModAModB,它们都使用Mixin,被应用程序环境加载。ModA打包了Mixin的0.6版本,ModB包含0.7版本。两个库都在其配置中指定了正确的minVersion

如果ModA恰好在ModB之前加载,加载的Mixin版本将是0.6。当ModB尝试添加其Mixin配置时,应用程序可以快速失败(fail-fast),因为它检测到加载的Mixin版本太旧,无法支持ModB的Mixin所需的特性。

然而,如果ModB忘记更新配置中的minVersion属性,应用程序将在稍后以非确定性方式失败。根据具体情况,后续出现的错误可能看起来晦涩难懂,甚至可能不会暗示问题与过时的Mixin版本有关。

在配置中使用minVersion可以确保这种快速失败行为。

1.1 Mixin关于向后兼容性的一般约定

由于Mixin库的一般约定是,Mixin将始终保证为旧版本编写的Mixin要么继续工作,要么以确定性方式快速失败,因此运行时存在更高版本不会造成问题。

相反,如果存在比所需版本更旧的版本,可能会产生不可预测的结果,这可以通过包含minVersion属性来轻松解决。

1.2 使用构建脚本编写minVersion

minVersion属性本身被解析为字符串形式的语义版本号(semver-compatible version number),在其他情况下会被忽略。这意味着在minVersion属性中使用替换标记(例如${version})并在构建脚本中于编译时替换该标记是完全可行的。”无效”值在您的开发环境中会被忽略,而正确的值将出现在您编译后的产物中。

2. Mixin配置属性compatibilityLevel

随着Java新版本的发布,Mixin添加了新特性以支持这些新的语言特性。compatibilityLevel属性可用于将Mixin的运行级别提升到您希望使用的特性集所需的级别。默认级别是JAVA_6

目前,每个级别都能支持其下级语言级别的所有特性,可以预期这种情况将持续下去。

提升兼容性级别有两个目的:

  • 首先,如果当前运行时不支持请求的特性集(例如,在运行Java 8时尝试提升到JAVA_9),则操作可以快速失败。
  • 其次,如果未来的Java版本阻止与旧语言版本的安全互操作(例如,如果Java 12出现并需要进行与Java 6的破坏性更改,使得Java 6 Mixin在该平台上无法支持),那么这种情况也可以快速失败和/或将Mixin集合划分为当前代和遗留模式。

这意味着与minVersion属性一样,维护compatibilityLevel属性对于库的长期稳定性很重要。compatibilityLevel应始终设置为您的Mixin所需的最高级别。

文章目录
  1. 1. 1. Mixin配置属性minVersion
    1. 1.1. 1.1 Mixin关于向后兼容性的一般约定
    2. 1.2. 1.2 使用构建脚本编写minVersion
  2. 2. 2. Mixin配置属性compatibilityLevel