Java 项目结构组织
简单的library#
对于简单的library来说,我更推荐将所有的文件都放在同一个package下面,如简单的client封装
1 | package:com.xxx.yyy/ |
复杂的SpringBoot项目,负责多个业务模块#
备注:
- xxx、yyy代表大块的业务区分:如用户、订单、支付
- aaa、bbb代表小块的业务区分:如(用户的)登录、注册、查询
方案一:多业务模块通过子包来区分,不分子module#
module视图:
1 | example(maven artifactId: example-parent)/ |
依赖关系图:
graph TD service[example-service] springIgnite[example-spring-ignite] springIgniteTest[example-spring-ignite-test] starter[example-starter] testCommon[example-test-common] util[example-util] starter --> service service --> springIgnite service --> util service -.-> testCommon testCommon --> springIgniteTest springIgniteTest --> springIgnite springIgnite --> util
service包内视图:
1 | io.shoothzj.example/ |
方案二:根据业务模块拆分子module#
适用于大型项目,每个业务模块都比较大。
module视图:
1 | example(maven artifactId: example-parent)/ |
依赖关系图:
graph TD common[example-common] rest-xxx[example-rest-xxx] rest-yyy[example-rest-yyy] service-xxx[example-service-xxx] service-yyy[example-service-yyy] springIgnite[example-spring-ignite] springIgniteTest[example-spring-ignite-test] starter[example-starter] testCommon[example-test-common] util[example-util] starter --> rest-xxx starter --> rest-yyy rest-xxx --> common rest-xxx --> service-xxx rest-yyy --> common rest-yyy --> service-yyy service-xxx --> common service-xxx --> springIgnite service-yyy --> common service-yyy --> util common -.-> testCommon testCommon --> springIgniteTest springIgniteTest --> springIgnite springIgnite --> util
关于service模块引不引用rest模块的DTO,我的想法:
如果确实service模块和rest模块DTO差距比较大,可以拆分做转换,如果差距很小/没有差距,可以复用同一个DTO,放在service模块或者更底层的依赖。
service-xxx包内视图:
1 | io.shoothzj.example.service/ |