neste processo de modularização, uma boa alternativa é você tentar desenhar um grafo de dependências entre os seus módulos.
Explicando melhor: vamos imaginar que você tenha os módulos A, B, C, D e E no seu projeto.
Suponha que A dependa de B e C
A -> B
A -> C
Agora, suponha que C dependa de D e E
C -> D
C -> E
Desenhe isto no papel (aqui pelo fórum tá foda). Aí você consegue justamente evitar estes problemas de circularidade. Por que imagine o compilador na seguinte situação: A depende de B, e B depende de A.
Se eu vou compilar A, e B não está compilado, quando for tentar compilar B, caio num loop.
O ideal é que as dependências sempre tenham a forma de uma árvore, sem que haja retornos nas dependências.
Então, pensei e desenhei e não encontrei forma de não ter referencia. Inclusive modulos podem referenciar outros modulos.
A solução que eu queria mesmo era só separar um determinado pacote num jar diferente quando gerasse o jar da aplicação.
Estão, os módulos são apenas separações departamentais.
Queria dividir para facilitar a manutenção.
Por exemplo fiz alteração num modulo de compras do projeto quero só atualizar esse modulo no cliente. que muitas vezes utilizasse da internet para atualizar e enviar o jar todo é um grande custo.