我正在做一项任务,我应该设计一个简单的电话簿应用程序,分为多个模块。
- phonebook-api:从 xsd 文件生成的 jaxb 类、存储库、DAO 和服务的接口(interface)。
- phonebook-server:它由存储库、DAO 和服务的实现组成。它还具有用于将 xml 导入数据库的类。
- phonebook-web:该模块具有存储库、服务等所需的所有配置。此外,它还具有数据库配置。它有一些 xml 文件,用于生成在 DAO 和 sql 脚本中使用的 DBI 类,以创建一个简单的表来存储电话簿数据库中的联系人(它只有一个表)。此外,该模块还有一个简单的 Controller 。
- 电话簿客户端:简单的 MBean 应用程序。
现在的情况是这样的:
- phonebook-api 模块依赖于phonebook-web,因为它需要这些 DBI 类来实现 DAO 接口(interface)
- phonebook-server 模块依赖于phonebook-api,因为它需要存储库、DAO、服务的接口(interface)。由于这些生成的 DBI 类,它还依赖于电话簿网络。
- phonebook-web 模块依赖于这两个模块,因为配置需要它们。
所以,存在循环引用。你能帮我解决这个设计问题吗?
最佳答案
答案就在你的问题中。问题出在设计上。解决方案的关键是为每个模块分配不同的目的、分离关注点并避免相互依赖。
您可以探索的其他选项包括
这里看起来的反模式是您对
web
模块的依赖。这不太可能是理想的。您应该避免模块依赖于堆栈高层的单元。 这是我首先要尝试更改的:将共享代码从电话簿网络提取到共享模块之一。制作更小的模块。 Maven 对此没有问题。
如果a
依赖于包c
的b
,并且b
依赖于a
对于 java 包d
,那么您可以将包c
和d
提取到一个单独的模块中,该模块上都有a
和b
具有依赖关系。检查您是否确实需要单独的模块。
也许毕竟没有必要将phonebook-api
、phonebook-server
和phonebook-web
放在单独的模块中。除非您打算在不同的应用程序中重用这些模块,否则最好使用单个phonebook-web
以及其中包含所有当前模块的代码。
关于java - maven多模块项目中的循环引用。我能做什么来修复它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49415917/