So, project A which compiles to JAR A requires classes in JAR B.Project B which compiles to JAR B requires classes in JAR A.
I was asked about this, so I suggested decoupling the projects such that on a clean system with no JARs, project A and project B can be built.
On thinking about this, there is two approaches to the solution.
Solution 1 - Declare methods in interfaces and then have project A use these interfaces instead of depending on the classes directly, and similarly for project B. This will require implementing class factories, which returns singleton classes that implements these interfaces.
Solution 2 - An approach that is quite tedious.
In 2017, with the release of Delphi 10.2 Tokyo, Embarcadero introduced a specialized implementation of the Observer pattern into the System.Classes unit. While it has been in the wild for 9 years, it remains a "hidden" architecture for many, primarily because it serves as the invisible engine behind LiveBindings. Other than live bindings, you can also use the Observer pattern as a way to update component settings to the Windows registry, an .ini file, or persist it elsewhere.
System.Classes