如何修复Java模块之间的循环依赖关系?

时间:2019-03-30 09:18:51

标签: java java-module

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

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

Module dependencies

我当前的方法-模块信息。每个模块的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;
}

2 个答案:

答案 0 :(得分:3)

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

常见策略:

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

答案 1 :(得分:0)

一个极端的案例,但是仍然值得寻找:

因为我很懒,所以我将module-info.java文件从“父”模块复制到了孩子,然后将依赖项添加到了“父”,最后在“孩子”中得到了一个模块信息文件。如下:

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

Gradle刚刚抱怨涉及模块com.pany.parent的周期性依赖关系……

当然,这完全是我的错,但是在迁移到拼图之后工作了几个小时,由于树木太多,您有时看不到森林……