如何修复 java 模块之间的循环依赖?

How to fix cyclic dependency between java modules?

我正在重构代码以便它使用模块。我面临的问题是,我在模块之间有循环依赖:convertersapp、validatorsapp 和 modelapp。共有6个模块,即:

1. convertersapp
2. exceptionsapp
3. mainapp
4. modelapp
5. serviceapp
6. validatorapp

我目前的方法 - 模块信息。 java 每个模块的文件是:

1. convertersapp: module convertersapp {
  requires modelapp;
  requires gson;
  requires exceptionspp;
  requires validatorapp;
  exports converters.others to serviceapp;
  exports converters.json to modelapp;
}

2. exceptionsapp: module exceptionspp {
  exports exceptions to convertersapp, mainapp,serviceapp, modelapp;
}

3. mainapp: module mainapp {
  requires serviceapp;
  requires exceptionspp;
  requires modelapp;
}

4. modelapp: module modelapp {
  exports model to mainapp, validatorapp,convertersapp, serviceapp;
  exports model.sorting to mainapp,serviceapp;
  requires gson;
  requires exceptionspp;
  requires convertersapp;
}

5. servicapp: module serviceapp {
  exports service to mainapp;
  requires modelapp;
  requires exceptionspp;
  requires convertersapp;
}

6. validatorapp: 

  module validatorapp {
  exports validator to convertersapp;
  requires modelapp;
}

应该避免循环依赖层次结构,因为它很难理解,而且还不清楚应该按什么顺序构建模块(A 之前 B 之前 C 之前 A ...)。

常用策略:

  • 将所有三个模块合并为一个
  • 构建一个通用实用模块,供其他人使用,但它本身不使用其他人。
  • 移动一些类以避免循环。

一个极端案例,但值得寻找:

因为我比较懒,我把 module-info.java 文件从 'parent' 模块复制到子模块,然后添加了对 'parent' 的依赖,最后得到一个模块信息'child' 中的文件如下:

module com.pany.parent
{
    requires transitive com.pany.parent;
}

Gradle 只是抱怨涉及模块 com.pany.parent

的循环依赖

当然这完全是我的错,但是在迁移到 Jigsaw 的几个小时后,您有时会因为树太多而看不到森林……