【问题标题】:How to handle major framework/dependency upgrades?如何处理主要的框架/依赖升级?
【发布时间】:2011-01-25 05:52:53
【问题描述】:

寻找一些处理项目中主要依赖项升级的最佳实践,假设使用依赖项管理工具(例如,Maven 2)。

具体来说,我感兴趣的是:

  • 如何使继承的应用程序保持最新(例如 Spring 1.2.x 到 2.5.x)
  • 在这样的大修之后可以采取哪些做法来使应用程序保持最新状态

欢迎您自己的经历或您遇到/发现有用的任何文章/论文。

编辑: 更新依赖版本号很简单。我更多的是寻找您如何根据对依赖项的更改(弃用、删除、参数/返回值类型的更改等)来处理您需要进行的更改。如果将来有一种好方法可以缓解这些变化,因为保持你的依赖关系是最新的应该让你掌握变化并防止浪费大量时间只是为了获取功能“更安全的 x 2.1”。

【问题讨论】:

    标签: java upgrade dependency-management


    【解决方案1】:

    处理依赖项更改的良好做法与应用程序设计的良好做法相同。您希望对架构进行分层并最大限度地减少代码在每个依赖项上的广泛耦合,以保持更改隔离,以便升级依赖项不会破坏应用程序的每个部分。接口代码并将业务逻辑与基础架构代码分开。

    对于次要升级(升级依赖项的点版本),如果您有一套全面的单元测试来检测由于 API 更改导致的故障,这将很有帮助。这就是为什么有时编写表面上看起来总是有效的琐碎测试会有所帮助的一个重要原因。这方面的一个例子是编写一个简单的 JDBC 单元测试来执行一个简单的查询。这似乎是一种浪费,直到您在数据库升级后发现 JDBC 驱动程序的运行时问题(这发生在我身上)。

    对于较大的更改(例如在 Spring 等框架的不兼容版本之间进行升级),如果您有一些自动化的功能或集成测试,或者至少有一个功能规范,您的 QA 人员可以运行以验证高级功能,这会有所帮助.如果您要升级的框架 API 的差异足以需要进行广泛的代码更改,则单元测试可能不再相关。

    管理从一个版本的依赖项迁移到另一个不兼容的版本的实际战术部分实际上取决于您在做什么。一个成熟的库将提供某种迁移路径,并且希望不会要求您重写所有内容。将与框架升级相关的代码更改与与实现新功能相关的更改分开是一个好主意。这样,如果出现问题,您就会知道这与框架升级有关,而不是您在实施新功能时出现的问题。

    让这变得如此困难的部分原因在于,在运行时,您的 JVM 中只能拥有特定依赖项的一个版本,因此您必须一次更新所有代码。 OSGi 通过允许在同一个中运行的不同 OSGi 包依赖于不同的依赖版本来解决这个特殊问题,因此您可以在运行时依赖不同的依赖版本。这就是 Eclipse 在不破坏其他插件的情况下管理插件依赖项的方式。

    【讨论】:

      【解决方案2】:

      根据我的经验,依赖项升级是由于依赖项拥有所需的功能而实现的,作为对直接影响您自己代码的依赖项中的错误的修复,以支持新的 Java 版本或保持您的代码兼容特定标准(关于影响安全性的依赖项)。如果您的代码不属于这些必要领域之一,我不会费心让它们保持最新,而是只在必要时更新它们,因为从一个版本到另一个版本的更新实际上可能会给您的应用程序带来错误。

      我一直发现,最佳实践始于完成应用程序的生产周期,将其作为稳定版本发布,并在下一次开发迭代中手动更新依赖项。将您的版本集中在您的父 POM 中将导致最小的依赖版本修改和增加的可扩展性。假设您使用的是 Maven:

      <dependency>
         <groupId>your.dep.group</groupId>
         <artifactId>your-artifact-id</artifactId>
         <version>${desiredVersion}</version>
      </dependency>
      

      【讨论】:

      • 我明白你在说什么,但你在掩饰这个问题。完全地。假设您处于其中一种情况,有哪些最佳实践? (或者每个人都只是让 Eclipse(也许是 m2eclipse)让你知道哪些类不再存在,已经被弃用等等......然后从那里开始?)对于我问题的第二部分,保持你的依赖关系有点最新由于您列出的原因,-date 可能有助于使将来的升级更容易(如果您已经升级到具有“Securer X 2.0”功能的版本并减轻了任何中断,则没有必要)。
      • 关于最佳实践,我想说的是:只有当您使用的依赖版本明显没有减少它时,才更新您的依赖。让您的 IDE 告诉您某些东西何时被弃用或不再存在,这就是它的用途。我不相信保持最新会阻止未来广泛的代码更改。这假设您了解依赖项的开发。您所能做的就是测试、测试、测试并最小化您对依赖项的依赖。
      猜你喜欢
      • 2019-08-26
      • 1970-01-01
      • 2015-08-11
      • 2022-08-03
      • 2014-05-28
      • 2020-01-05
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多