如何修复 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 的几个小时后,您有时会因为树太多而看不到森林……
我正在重构代码以便它使用模块。我面临的问题是,我在模块之间有循环依赖: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 的几个小时后,您有时会因为树太多而看不到森林……