【问题标题】:Upgrading large application from spring 3.0.x to 4.1.x - What best practices / procedures should I follow?将大型应用程序从 spring 3.0.x 升级到 4.1.x - 我应该遵循哪些最佳实践/程序?
【发布时间】:2018-03-13 21:36:46
【问题描述】:

我已经使用 Spring 大约一年了,而且我使用它已经足够舒服了,但我大部分时间都避免跳到引擎盖下。

我的任务是将一个大型的关键任务企业应用程序从 Spring 3.0.x 升级到 Spring 4.1.x。

进行这样的大型、不可避免的挑剔和复杂更改的最佳做法是什么? (除'之外的任何内容都可以放入 jar 文件中,看看会发生什么''请阅读此处的文档:http://spring.io/' 会非常有帮助)

系统:

  • Java 6 - jax-b/-p/-ws/,Apache Commons,

  • Spring 3.0.5 - 常规(核心、上下文、bean 等)、MVC、AOP、ORM、JDBC、Acegi

  • 休眠 3.5

  • Tomcat 6

  • 0 单元测试或任何类型的自动化测试。

  • Maven 依赖管理和构建自动化。

  • 一半控制器使用注释进行请求响应映射,一半使用 simpleFormController 模式,一半自动装配,一半与 xml 挂钩。

  • 数百个视图,数十个控制器。

到目前为止我已采取的步骤:

  • 准备了一个(大部分是自动化的)回归测试脚本(这样我就可以确保我没有破坏任何东西)

  • 我已经开始一次阅读“升级指南”,“升级到 3.1”、“升级到 3.2”,并对听起来很熟悉的事情做笔记,但我认为我需要对我们的系统和整个弹簧有更深入的了解,然后我才能确信这是一种详尽的方法。这通常感觉像是一种随意的方法,对于如此复杂的变化,这不是我想要的。

我的问题:

  • 对于此类工作,哪些步骤/程序被视为“最佳实践”?

  • 对于这样的工作,你有什么“陷阱”吗

【问题讨论】:

  • 你想升级是为了升级运行时还是为了获得 4.x 的好处?
  • 这是真正的问题:0 个单元测试或任何类型的自动化测试。
  • @axiopisty 是的!我在第一天就提出了建议,但交货时间和完全缺乏可见的用户利益意味着它一直被推到列表的底部。我决定暂时选择我的战斗,并且刚刚解决了足够的时间来编写自动回归测试脚本。
  • @bhantol 我的工作是让我们达到 4.0 的最低规格。以便更新的库/依赖项/功能等根据需要兼容。我们差点错过了让一个非常节省时间的新库工作。管理层终于看到了它对底线的影响,并给了最初级的团队成员几天的时间来完成它-_-

标签: java spring spring-mvc


【解决方案1】:

显然,不会有“标准”的推荐做法集,因为每次迁移/升级都是不同的。这是我的想法:

  1. 要求,要求,要求

    回归测试脚本是一个很好的开始。如果有完整的特性/功能文档,那么迁移的“成功标准”很简单。

    如果文档不完整/不存在,则进行双重和三重检查,以确保您的测试捕获了所有“要求”。创建文档也可能是一个好主意。并让产品经理/主管签字。您会惊讶于即使在简单系统中也存在多少“隐藏”需求。在没有全面要求的情况下,低估迁移所需工作量的风险很大。

    在时间表方面设定正确的期望非常关键。也许采用一种敏捷方法,每两周演示一次你取得了多少进展,这将有助于让每个人都保持一致。

  2. 春季项目已经发展了很多。学习时间预算。

    这可能是一个大问题。自 Spring 3.x 以来,Spring 项目和 Java 开发已经发展了很多。重大变化包括:

    • Java 8 功能
    • JavaConfig(相对于 xml 配置)
    • Acegi 现在是 Spring Security
    • Spring 项目通常使用 Spring Boot
    • 从 Maven 切换到 Gradle 以构建项目
    • 使用 Jenkins(或其他 CI 工具)的完整 CI
    • 单元和集成测试已转向使用注释(和模拟框架)

【讨论】:

    【解决方案2】:

    嗯,回答你的问题并不容易,因为有很多事情需要考虑。

    首先,我建议您使用直接来自“来源”的Migrating from earlier versions of the Spring Framework guide

    我会特别提请您注意“强制最低依赖版本”部分,该部分建议您使用一些广泛使用的库的最低版本级别。 显然,当您插入这些新版本时,它们会带来一些可能产生冲突的传递依赖。 另请查看依赖项更新部分。

    还要记住在 pom 文件中正确定义依赖项的范围,因为其中许多可以由您使用的基础架构(即 Tomcat)提供。

    我认为您将需要迁移到 Java 7 或 8,并且 Tomcat 也应该更新到版本 7 或更好的 8。

    此外,尝试使用 maven 尽可能多地自动化构建和测试环境,同时采用像 Jenkins(或 Hudson,如果您更喜欢该产品)这样的 CI 环境。

    对每个小方法/代码段执行单元测试也非常重要,因为它会使集成测试更容易。

    您还应该熟悉Spring 4.x new features 并尝试利用它们,尤其是那些与测试改进有关的东西。 新功能的简要介绍如下:

    • 删除了已弃用的包和方法
    • Java 8 支持
    • Java EE 6 和 7 成为基准
    • Groovy Bean 定义 DSL
    • 核心容器改进
    • 一般网络改进
    • WebSocket、SockJS 和 STOMP 消息传递
    • 极端使用注释的测试改进

    还可以查看 Petri Kainulainen 的 Spring MVC Test Tutorial,它可以为您提供大量有关测试的信息。

    【讨论】:

    • 谢谢!自从提出这个问题以来,我已经将我们升级到 Java 7。请问我是否需要升级tomcat? tomcat 6 实现了满足最低要求的 servlet spec 2.5,不是吗?
    • 嗯,Tomcat 6 确实可以,根据您的需要考虑使用which version of Tomcat。这取决于其他交互的组件,或者您是否认为明年可能会被要求再次迁移...
    【解决方案3】:

    在继续之前,您必须回答以下问题。

    是否需要升级的只是某种依赖关系的库和运行时?

    您真的想充分利用 Spring 4.x 吗?

    一旦你决定了这一点,你就可以采取正确的路线。您创建的那些回归脚本将在这两种情况下都有帮助。如果您能想到一些粗略的一次性实用程序,它将通过一些有效的输入访问每个公共 api 并捕获输出,并且无法在这两个世界中进行比较,这可能会有所帮助,但它可能不适用于您的情况。

    因此,如果您想从 Spring 4.x 中受益,我建议您关注生产力方面并创建这些内容的清单。

    您可以在 Spring 4 中重新设计整个应用程序,就好像它是一个新应用程序一样。

    一旦你可以设想未来的状态。下一个问题简化为从 A 点到 B 点,即最佳迁移路径问题。

    【讨论】:

    • 我试图让我们达到 4.0 的最低规格,以便根据需要提供更新的库/工具/功能。我不需要将它们全部合并,只需让它们可用。也就是说,我正在执行一些功能(通过 XML 进行请求/响应映射的注释)
    【解决方案4】:

    从 Spring 3 迁移到 Spring 4,您可能会从 Spring 项目的 Spring Integration 3.0 to 4.0 Migration Guide 在 Github 上。

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2015-07-25
      • 2015-11-26
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多