我如何确定升级依赖项是否会破坏 jar 文件?
How can I determine if upgrading a dependency will break a jar file?
ore.spongepowered.org 是一个托管 Minecraft 插件的网站。
这些插件依赖于名为 SpongeAPI 的依赖项,以便 运行。
给定一个已上传到我们服务的 jar 文件,并具有将其与 Sponge 上的给定(semver)依赖项相关联的元数据API,我们如何确定是否存在二进制不兼容的更改影响给定插件的 SpongeAPI?
例如API 版本 5.
发布了一个插件 jar
API 5.1 (semver) 已发布,仅包含新增内容。只要 semver 已被强制执行,我们知道由于版本控制约定,该插件可能会工作。
API 6 发布,这是一个 semver 主要版本,但是 jar 是针对 API5 构建的,插件有可能仍然兼容,但不能保证。我们如何测试(使用工具)插件是否有任何对已删除代码的引用,或者它的签名是否从 API 5 -> API 6 ?
了解这一点很有价值,因为我们可以在人们使用可能不兼容的组合时警告他们。
注意:我们控制的是 Library SpongeAPI,而不是社区制作的插件。
常规方法是使用自动构建和持续集成工具构建系统,例如 Jenkins、Bitbucket Pipelines、Gitlab-CI 等(我假设您使用的是 Maven 或 Gradle 已经给出你已经在你的问题中标记了它们)。
如果更改(对较新的依赖项)改变了方法签名或其他重构等任何内容,构建将失败。
此外,您还应该进行单元测试以确保您的功能按预期工作。如果底层库的基本行为发生变化并影响您的功能,您也可以检测到。这将帮助您捕获功能更改,而不仅仅是编译问题。
最后,您可能想看看新的 Java 9 模块系统。它在采用方面仍然有点落后,但它可能会为您正在寻找的东西提供替代解决方案,特别是如果您也能控制依赖项。
即使依赖树中的每个组件都完全符合 SemVer 标准,您仍然需要带外(与 SemVer 相关)信息来关闭瞬态依赖项。一般的依赖图,特别是菱形点依赖问题,是已知的难题。测试可以在其中产生一个小但非常昂贵的凹痕,但对于具有成百上千个组件的服务器上的任何重要产品 运行 通常是禁止的。
您能做的最好的事情是将应用程序周围的环境容器化,并仅测试其中有趣的依赖组件组合,仅发布那些通过产品整个测试套件的组合。然后你可以说"here's a box that has our functional X pre-configured and we make no claims of compatibility with any other products or combinations of component versions"。特定于应用程序的 VM 最擅长将问题 space 减少到经济上可管理的表面。甚至像应用程序容器这样有点泄漏的环境也可以帮助驯服这只老虎。
ore.spongepowered.org 是一个托管 Minecraft 插件的网站。
这些插件依赖于名为 SpongeAPI 的依赖项,以便 运行。
给定一个已上传到我们服务的 jar 文件,并具有将其与 Sponge 上的给定(semver)依赖项相关联的元数据API,我们如何确定是否存在二进制不兼容的更改影响给定插件的 SpongeAPI?
例如API 版本 5.
发布了一个插件 jarAPI 5.1 (semver) 已发布,仅包含新增内容。只要 semver 已被强制执行,我们知道由于版本控制约定,该插件可能会工作。
API 6 发布,这是一个 semver 主要版本,但是 jar 是针对 API5 构建的,插件有可能仍然兼容,但不能保证。我们如何测试(使用工具)插件是否有任何对已删除代码的引用,或者它的签名是否从 API 5 -> API 6 ?
了解这一点很有价值,因为我们可以在人们使用可能不兼容的组合时警告他们。
注意:我们控制的是 Library SpongeAPI,而不是社区制作的插件。
常规方法是使用自动构建和持续集成工具构建系统,例如 Jenkins、Bitbucket Pipelines、Gitlab-CI 等(我假设您使用的是 Maven 或 Gradle 已经给出你已经在你的问题中标记了它们)。
如果更改(对较新的依赖项)改变了方法签名或其他重构等任何内容,构建将失败。
此外,您还应该进行单元测试以确保您的功能按预期工作。如果底层库的基本行为发生变化并影响您的功能,您也可以检测到。这将帮助您捕获功能更改,而不仅仅是编译问题。
最后,您可能想看看新的 Java 9 模块系统。它在采用方面仍然有点落后,但它可能会为您正在寻找的东西提供替代解决方案,特别是如果您也能控制依赖项。
即使依赖树中的每个组件都完全符合 SemVer 标准,您仍然需要带外(与 SemVer 相关)信息来关闭瞬态依赖项。一般的依赖图,特别是菱形点依赖问题,是已知的难题。测试可以在其中产生一个小但非常昂贵的凹痕,但对于具有成百上千个组件的服务器上的任何重要产品 运行 通常是禁止的。
您能做的最好的事情是将应用程序周围的环境容器化,并仅测试其中有趣的依赖组件组合,仅发布那些通过产品整个测试套件的组合。然后你可以说"here's a box that has our functional X pre-configured and we make no claims of compatibility with any other products or combinations of component versions"。特定于应用程序的 VM 最擅长将问题 space 减少到经济上可管理的表面。甚至像应用程序容器这样有点泄漏的环境也可以帮助驯服这只老虎。