简体   繁体   中英

How to solve circular dependency in gradle multi-project build

Consider the following situation. I have two gradle (sub-)projects called "A" and "B". A defines some classes/interfaces that are being referenced by B. So B has a compile dependency to A. Now A is a web server that should be started with B on the classpath. How do you achieve that with gradle?

Of course it is not possible to add B as compile dependency to A because that would mean a circular dependency between A and B. Even adding B as runtime dependency to A did not work because then compile errors in B state that referenced classes from A do not exist. But why?

One solution would be to move code from B into A but I really would like to separate that code because there might be another implementation of B later that I want to swap easily in A (eg by exchanging the jar in runtime classpath).

Another solution I was thinking about is to separate classes from A referenced by B into a new module and make both A and B depend on that new module. This sounds valid but that would imply to move persistence layer from A to that new module which feels wrong.

Additional information: A is a Spring boot web application with persistence layer, web services etc, B produces a JAR.

Circular dependencies are a well known problem when you try to get Dependency Injection. In this case, you have something similar but at module level

The only way I see you can solve your issue is by creating a third module C with the common code (probably the A interfaces referenced by B)

This way you can compile C (it doesn't have any dependencies), A (it depends on C ) and B (it depends on C ) and launch A with B in its classpath

Everytime you end up with circular dependency you probably should introduce another entity to break the cycle.

Have a look at my explanation in this other QA article (it's dealing with packages and classes, but idea is the same): What does it mean and how to fix SonarQube Java issue "Cycles between packages should be removed" (squid:CycleBetweenPackages)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM