我们可以依靠 maven 在运行时处理 Class 加载问题吗?

Can we depend on maven to handle Class loading issues at runtime?

亲爱的,

我们正在将遗留项目从 ant 迁移到 maven。

有很多依赖项,我们想清理它们。

This question(尤其是第一条评论)确实引起了一些担忧...

这是一个大项目,在整个日历年中使用情况各不相同,而且我们没有太多的测试覆盖率,因此 'just running the tests' 我们无法做到。

如果项目使用 maven 进行编译和部署,是否有办法让它在运行时失败?

如果是这样,有没有办法缓解这种情况'somehow'?

感谢您的想法和见解,非常感谢所有输入...

为了这次谈话的经济性,我们假设不存在任何错误。

哪些东西会以不可预知的方式损坏?

  • 即使您能够编译项目,您也永远无法 100% 确定已正确迁移所有内容。默认值的处理方式可能与 Ant 和 Maven 不同。因此,您可能使用了一个依赖项(瞬时的或非瞬态的),其工作方式与您的原始依赖项略有不同。
  • Maven 比 Ant 更加标准化,这意味着您将无法始终在 Maven 和 Ant 中做完全相同的事情。 Ant 可能使用脚本,而 Maven 可能使用您无法控制的插件。这可能会导致您的应用程序出现不同的行为。

你能做些什么来解决这个问题?

  • 投入一些时间并编写一些集成测试,至少是快乐路径,加上一些常见的红色路径。
  • 测试,测试,再测试。手动测试可以揭示意外行为。
  • 逐步推出新版本。如果您将解决方案部署到大量服务器,请先尝试仅在其中一台服务器上部署并监控异常情况。如果您可以启动一个新服务器并且只向那里提供少量流量(例如 5%),以使用真实数据监控错误,同时又不会严重影响您的可用性,那么您也应该这样做。

永远记住,迁移伴随着风险。此外,这可能是从现在开始接受单元和集成测试的一个很好的理由。 :)

是的,任何编译的项目在运行时都可能以多种方式失败,例如运行 针对不同的库版本。

至少您必须比较输出工件,因为在一天结束时 Ant 和 Maven 都会构建一个可部署的工件:WAR 或具有依赖项的 JAR。检查两者的库版本,它们很可能不同,因为 Ant 不处理依赖项解析(除非你使用 Ivy)。