java - 跨多个项目的 Maven 和重构

标签 java maven refactoring multiple-projects

我目前正试图找到一个合适的工作流来跨多个 Maven 项目执行重构,但我找不到任何令人满意的解决方案。

假设有三个项目。一个名为 common 的项目和两个名为 app1app2 的依赖项目。每个都在一个单独的 Git 存储库中。

现在假设 common 中名为 StringUtils.trim() 的方法应重命名为 StringUtils.getTrimed()。因为此方法被app1app2 使用,所以这些项目也需要进行调整。

现在的问题是,向开发团队提供此修改的正确工作流程是什么。鉴于这种情况:一个由大约 10 名开发人员组成的团队使用中央 SCM 服务器和中央 Maven 存储库服务器来托管 Artifact 。

可能的工作流程:

  1. 只需将更改提交到 SCM(对于所有三个项目) --> 问题:例如,开发 app1 的开发人员可能没有 checkout 项目 common,而是使用来自中央 Artifact 服务器的二进制文件。当他们从 SCM 获取最新版本的 app1 时,他们的构建将会中断。不好!<​​/p>

  2. 除 1 之外,将 app1 的依赖项更改为指向 common 的 SNAPSHOT 版本。 --> 问题:当 app1 开发人员从 SCM 获取最新版本时,如果更新策略是,他们可能不会获得 common 的最新快照设置为 DAILY(默认值)。不好!<​​/p>

  3. 除了 2,将 SNAPSHOTS 的更新策略更改为 ALWAYS。 --> 问题:现在,app1 的开发人员将获得 common 的最新 SNAPSHOT 并且一切正常,但前提是在我之前将 SNAPSHOT 部署到 Artifact 服务器将更改提交到 app1!此外,在将 common 项目部署到 Artifact 服务器和我将 app1 提交到 SCM 之间有一个时间段。如果开发人员获取 common 的最新 SNAPSHOT,它将与 SCM 中 app1 的当前版本不兼容,因为我还没有提交对 app1 的更改 还没有。不好!<​​/p>

我能想到的唯一可行的解​​决方案是跳过 SNAPSHOT 机制并使用版本。这是工作流程:

  • 在我的机器上本地更改三个项目后(在任何提交之前),将 common 的版本从 1.0 增加到 1.1。
  • common 提交给 SCM,并将其部署到 Artifact 服务器。
  • 仅在部署完成后,将app1app2 中的依赖项更改为指向新版本的common 并提交app1app2

这种方法的问题:我必须做版本管理,所以这只能与整个团队协调并考虑所有依赖项目来完成。此外,我必须等待 common 项目部署到 Artifact 服务器,然后才能将更改提交到 app1app2

有没有简单灵活的机制,如何进行这样的重构?我希望有人能帮助我。也许我这边也有一些误解。

最佳答案

如果重构是您在示例中建议的类型,我认为您不会找到一种简单的重构方法。您在这里基本上拥有的是从应用程序 1 和 2 到通用的第三方依赖项。而且,正如您可能已经注意到的那样,第三方依赖项不会经常更改其接口(interface)方法的名称,这是有充分理由的 - 这对任何试图更新到最新版本的人来说都是 hell 。

我建议您尽可能保留接口(interface)方法的名称,名称应该有严重错误才能更改(名称说明它做了一些它没有做的事情)反之亦然)。想要将“trim()”更改为“getTrimmed()”并不是这样做的充分理由。

所以,我的建议是:

在通用的内部部分进行您想要的所有重构,保持界面不变。如果你真的必须重命名某些东西,用新名称复制有问题的方法,将旧方法标记为已弃用,并让它们都存活一段时间,直到可以合理地假设每个人都开始使用新的,并停止使用旧的。

关于java - 跨多个项目的 Maven 和重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12422670/

相关文章:

maven - 无法执行目标 org.apache.maven.plugins :maven-surefire-plugin:2. 10:test

java - 重构依赖循环的方法

ruby - 如何在 Ruby 应用程序中找到未使用的方法?

java - 使用列表参数将 HQL 查询转换为可执行的 SQL 查询

java - 使用 Google App Engine 群聊 XMPP

java - 将标识符与字符串、数字和 _ 进行匹配

java - 我的 Maven 构建中缺少 AbstractAnnotationConfigDispatcherServletInitializer

java - 在 JVM 中,Thread 对象是直接绑定(bind)到 CPU 内核,还是两者之间有一个 Mapper?

java - Spring数据和Java泛型: How to combine multiple repository interfaces into one?

java - 记录分数的程序中的 if/else 语句