Maven Referência Cíclica - Multi-Módulos

Pessoal, estou modelando um ERP (Compras, Fiscal, Estoque e etc … ) e estou utilizando o maven2 para controle das dependências, porém, existe um problema referente a referência cíclica entre os módulos.

O projeto é constituido por N módulos.

POM Projeto:

   <modules>
      <module>modulo1</module>
      <module>modulo2</module>
      <module>modulo3</module>
   </modules>

POM Modulo1:

<dependency> <groupId>${project.groupId}</groupId> <artifactId>modulo2</artifactId> <version>${project.version}</version> <type>ejb-client</type> </dependency>

POM Modulo2:

<dependency> <groupId>${project.groupId}</groupId> <artifactId>modulo1</artifactId> <version>${project.version}</version> <type>ejb-client</type> </dependency>

modulo1->modulo2
modulo2->modulo1

Sei que isso não é correto, porém, existem algumas entidades que pertencem ao domínio do modulo1 e outras entidades que pertencem ao domínio do modulo2, e as vezes pode existir uma relação entre elas, por exemplo: Tenho uma Entidade “Pedido” que pertence ao módulo de “Compras” e outra Entidade “NotaFiscal” que pertence ao módulo “Fiscal”, e tenho uma relação entre elas, por exemplo posso lançar uma “NotaFiscal” através de um “Pedido” e preciso guardar o relacionamento com esse “Pedido” e a mesma coisa acontece do outro lado, se lancei uma “NotaFiscal” através de um “Pedido”, no “Pedido” eu tenho que gravar a relação com “NotaFiscal”, porém, como cada Entidade está em um módulo está ocorrendo um problema de referência cíclica. Alguém tem alguma sugestão de como contornar essa problema?

Estou cogitando criar um módulo “domínio”/“entidades” ou qualquer coisa do tipo e todos os outros módulos terem dependências com ele, o único problema é o quesito tempo, isso vai exigir uma grande quantidade de refatoração, por isso gostaria de saber se existe outra solução.

  • Error stacktraces are turned on.
    [INFO] Scanning for projects…
    [INFO] ------------------------------------------------------------------------
    [ERROR] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] The projects in the reactor contain a cyclic reference: Edge between ‘Vertex{label=‘br.com.copagaz:copamais-fiscal’}’ and ‘Vertex{label=‘br.com.copagaz:copamais-compras’}’ introduces to cycle in the graph br.com.copagaz:copamais-compras --> br.com.copagaz:copamais-fiscal --> br.com.copagaz:copamais-compras
    [INFO] ------------------------------------------------------------------------
    [INFO] Trace
    org.apache.maven.BuildFailureException: The projects in the reactor contain a cyclic reference: Edge between ‘Vertex{label=‘br.com.copagaz:copamais-fiscal’}’ and ‘Vertex{label=‘br.com.copagaz:copamais-compras’}’ introduces to cycle in the graph br.com.copagaz:copamais-compras --> br.com.copagaz:copamais-fiscal --> br.com.copagaz:copamais-compras
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:295)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
    Caused by: hidden.org.codehaus.plexus.util.dag.CycleDetectedException: Edge between ‘Vertex{label=‘br.com.copagaz:copamais-fiscal’}’ and ‘Vertex{label=‘br.com.copagaz:copamais-compras’}’ introduces to cycle in the graph br.com.copagaz:copamais-compras --> br.com.copagaz:copamais-fiscal --> br.com.copagaz:copamais-compras
    at hidden.org.codehaus.plexus.util.dag.DAG.addEdge(DAG.java:143)
    at hidden.org.codehaus.plexus.util.dag.DAG.addEdge(DAG.java:123)
    at org.apache.maven.project.ProjectSorter.(ProjectSorter.java:118)
    at org.apache.maven.execution.ReactorManager.(ReactorManager.java:99)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:288)
    … 11 more
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: < 1 second
    [INFO] Finished at: Thu Aug 30 15:44:05 BRT 2012
    [INFO] Final Memory: 2M/15M
    [INFO] ------------------------------------------------------------------------

Atenciosamente,
David Machado

mas dai tem problema de análise, na minha visão, vc deveria fazer a notafiscal ser dependente do pedido, o pedido vai existir mesmo que não tenha notafiscal, e uma notafiscal precisa de um pedido(não todas é claro), mas vendo a partir dessa perspectiva, acredito q seria assim, me corrigam, se eu estiver enganado

Na verdade o Pedido em si não tem uma Nota Fiscal, quem teria uma ou várias Notas Fiscais seriam os itens do Pedido, porque um item de Pedido pode gerar N itens de Nota Fiscal, mais isso nem vem ao caso no momento e também não posso permitir cancelar um pedido que já tenha uma nota fiscal vinculada, então mesmo que não tivesse relação alguma na entidade item de pedido, ainda sim eu precisaria acessar informações da nota para saber se eu posso deixar cancelar o pedido ou não, o que levaria a ter que acessar dados de outros módulos, que é onde está ocorrendo o problema.

A descrição com Nota e Pedido foi só um exemplo, existem outras situações que isso ocorre, até concordo que a arquitetura do sistema poderia estar de outra forma, porém, cheguei aqui e a modelagem já estava assim, agora tenho duas saídas, tentar contornar o problema da referência cíclica ou encarar a mudança de arquitetura que pode ou não ser aceita pelos superiores.

Simples: http://www.coderanch.com/t/462627/tools/recursive-dependency-circular-dependency-Resolved