我如何确定升级依赖项是否会破坏 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 减少到经济上可管理的表面。甚至像应用程序容器这样有点泄漏的环境也可以帮助驯服这只老虎。