I like the idea of a Java facade and avoiding AOT (except that means we have source code in our commercially distributed application... that's another problem that we can ignore for some time since the Clojure code isn't exactly revealing much IP).
With gen-class I need to specify the stubs anyway (at least I don't know of any other way to do it) so I can just specify them in the Java facade you mention.
So your proposed solution highlights exactly the situation I'm in (I am currently using AOT to generate classes to call from Java).
For readers that aren't familiar with AOT, it stands for ahead-of-time compilation and is not the default in Clojure. By default Clojure code is compiled at runtime. If my code was compiled at runtime then it would have access to all the compiled Java classes I wrote and there would be no problem with circular dependencies. I chose to use AOT because it seemed to simplify calling Clojure from Java because you could treat the Clojure name space as a class and the functions as static methods without doing anything in Java. Without AOT, calling Clojure code from Java required more steps and work. Obviously, this has the problem I mentioned at the beginning of this thread.
Now, I'm going to try without AOT and using Java facades.
Thanks,
Jason