2014-10-20 18 views
7

Sto cercando un modo per includere tutti i moduli in un progetto da un altro pom.xml. Quindi nel mio caso ho un pom genitore con l'imballaggio impostato su pom. Contiene 3 moduli figlio che implementano le mie interfacce in un altro modulo API. Voglio includere dinamicamente tutti i moduli figlio nel mio progetto in Maven.Come includere tutti i moduli dal progetto pom

In questo caso, desidero includere il connettore1, connettore2, connettore3 in un altro modulo senza dover specificare implicitamente il connettore 1,2,3.

connectors - packaging: pom 
    connector1 - packaging: jar 
    connector2 - packaging: jar 
    connector3 - packaging: jar 

Ho provato a includere i connettori pom nel mio progetto ma questo non ha funzionato. Speravo che la specifica del pacchetto genitore con pom includesse i moduli figlio, ma questo non ha funzionato. Ci sono soluzioni alternative per come farlo?

Aggiornamento

questo è stato più di mia piccola fissazione perché volevo aggiungere semplicemente un singolo connettore e hanno tutti i vasetti delle dipendenze dei moduli bambino per il progetto da includere. Ciò renderebbe il pom un po 'più semplice da leggere.

Invece di dover registrare tutte le dipendenze figlio in questo modo

<dependencies> 
     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-api</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-etl</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-persistence</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-api</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-etl</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-persistence</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2-other</artifactId> 
      <version>0.0.1</version> 
     </dependency> 
     ... 
</dependencies> 

Questo è solo un esempio per chiarire la domanda iniziale. Non esiste e probabilmente avrebbe ripercussioni se funzionasse.

<dependencies> 
     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1</artifactId> 
      <version>0.0.1</version> 
      <type>pom</type> 
      <include>submodules</include> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector2</artifactId> 
      <version>0.0.1</version> 
      <type>pom</type> 
      <include>submodules</include> 
     </dependency> 

</dependencies> 

se non ricordo male stavo creando un progetto modulare per un sistema di ordinazione dove ho avuto un'API comune che il nostro sistema interno userebbe (REST). Stavo creando un sistema di routing in cui avrei potuto indirizzare un ordine a un singolo centro di evasione ordini in base a un criterio dell'ordine (paese, imposte prioritarie, ecc.). Ciascuno dei centri di evasione aveva le proprie API (connettori).

L'esempio è notevolmente semplificato nella domanda originale per rendere più conciso il problema. Nel progetto reale ogni connettore (1,2,3) sarebbe stato un pom separato con giare a dipendenza multipla. Uno per la loro API cliente, quindi un po 'di codice etl da abbinare alla mia API originale.

Non ricordo come ho risolto questo. Penso che dovessi solo includere tutte le dipendenze dei bambini.

+0

Avete un progetto di esempio da qualche parte (github?) Dove possiamo ottenere un'impressione migliore di ciò che state provando a fare esattamente? – khmarbaise

+1

@RobinJonsson La domanda non è chiara. Cosa significa esattamente * include * significa qui? Quale risultato finale vuoi? Vuoi dire che vuoi compilare automaticamente la sezione '' in POM 'connettori'? O da qualche altra parte? Potresti espandermi un po '? – Tunaki

+1

@Tunaki Il risultato che voglio è poter aggiungere nuovi pacchetti "connectorX" senza doverli specificare come dipendenze da qualche altra parte. Per esempio, ho un altro modulo che è confezionato come WAR. Vorrei aggiungere una dipendenza da WAR a "connettori", e ogni volta che aggiungo un nuovo "modulo-figlio" (forse connector4) ai connettori, è automaticamente impacchettato con il file WAR. Non ho il formato di imballaggio desiderato per i miei connettori. Non importa se i connettori sono confezionati come JAR separati o un uber-jar. Finché sono inclusi nella mia GUERRA. –

risposta

10

Un modo è creare un quarto modulo che "avvolge" i 3 moduli come dipendenze. In questo modo potresti dipendere da questo modulo wrapper che lo farebbe.

connectors - packaging: pom 
    connector1 - packaging: jar 
    connector2 - packaging: jar 
    connector3 - packaging: jar 
    connectorWrapper - packaging: pom (depends on the above three) 

Anche se sarebbe più senso di dichiarare in modo esplicito una dipendenza per ciascun connettore in particolare che sono solo tre.

soluzione alternativa:

Un approccio più dinamico (anche se molto un eccessivo IMO) è di avere questo quarto pacchetto modulo moduli di attuazione di un assieme utilizzando una consuetudine assembly descriptor.Ad esempio, all'interno connectorWrapper, si potrebbe scrivere un assembly.xml:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> 

    <id>impl-modules</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
     <fileSet> 
      <directory>${project.basedir}</directory> 
      <includes> 
       <include>pom.xml</include> 
      </includes> 
      <useDefaultExcludes>true</useDefaultExcludes> 
     </fileSet> 
    </fileSets> 
    <moduleSets> 
     <moduleSet> 
      <useAllReactorProjects>true</useAllReactorProjects> 
      <includes> 
       <include>*:connector*</include> 
      </includes> 
      <binaries> 
       <includeDependencies>false</includeDependencies> 
      </binaries> 
     </moduleSet> 
    </moduleSets> 
</assembly> 

Nota che il descrittore dice il plugin assemblea a:

  1. includono tutti i moduli nel reattore progetto corrente, in modo che quando si esegue mvn clean package nel progetto principale, includerà tutti i moduli

  2. comprendono solo moduli di attuazione (il connector modu i), come specificato nell'elemento include con *:connector*.

Naturalmente sarà necessario configurare il plugin di assemblaggio di utilizzare questo descrittore nel connectorWrapper (o qualsiasi altro nome scelto per questo involucro):

<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <descriptors> 
       <descriptor>assembly.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

Quindi è possibile eseguire su mvn install il progetto principale per installare il manufatto di montaggio, dopo di che si può dipendere da l'altro progetto:

<dependencies> 
    <dependency> 
     <groupId>groupId</groupId> 
     <artifactId>connectorWrapper</artifactId> 
     <version>...</version> 
     <classifier>impl-modules</classifier> <!-- note the classifier --> 
    </dependency> 
</dependencies> 
+2

Grazie, ma i miei obiettivi sono che gli altri siano in grado di creare implementazioni senza doverle aggiungere manualmente come un'altra dipendenza a un progetto. È una buona idea, ma sarebbe equivalente all'aggiunta all'elenco delle dipendenze nell'altro progetto. Penso che ci possa essere un modo per farlo con il plugin di assemblaggio, ma ora lo sto esaminando. –

+0

Non accettare questa risposta come risposta poiché include un altro progetto che sposta semplicemente la gestione delle dipendenze su se stesso. Il problema originale in cui sarebbe bello non dover specificare attivamente la dipendenza dai nuovi "connettori" è ancora aperto. –

+1

@RobinJonsson In effetti, come indicato dall'OP, potrebbe essere possibile con il plug-in di assembly. Aggiornato la mia risposta. – manouti

1

Non del tutto sicuro se exactl y fa quello che ti serve, ma nelle ultime versioni di Maven puoi usare lo scope import sulle tue dipendenze.

Il primo passo sarebbe quello di creare un pom che contiene tutte le dipendenze che si desidera includere in altri progetti:

<project> 

    <groupId>com.foo</groupId> 
    <artifactId>connectors</artifactId> 
    <version>0.0.1</version> 
    <packaging>pom</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-api</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.foo</groupId> 
      <artifactId>connector1-etl</artifactId> 
      <version>0.0.1</version> 
     </dependency> 

     ... 
    </dependencies>  
</project> 

Nei progetti che si desidera includere i connettori che avete:

<dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>connectors</artifactId> 
    <version>0.0.1</version> 
    <type>pom</type> 
    <scope>import</scope> 
</dependency> 

Vedere Importing Dependencies per ulteriori informazioni.

Un approccio alternativo potrebbe essere quello di utilizzare il plug-in assembly Maven e creare un singolo (enorme) jar contenente tutte le classi che si desidera includere (confezione jar singola); (per questo è anche necessario creare una volta un pom con tutte le dipendenze e il plugin di assemblaggio).

+0

Non significa ancora che devo specificare esplicitamente la dipendenza in 'connettori' su tutti i moduli figlio? –

+0

Sì all'interno del genitore principale è ancora necessario definire i moduli/dipendenze che devono essere parte. Pensavo che il tuo obiettivo fosse quello di avere una dipendenza dei connettori che potresti includere in altri progetti invece di includere separatamente ciascun connettore secondario. Potrebbe averti frainteso. – uniknow

+0

Va bene, dai un'occhiata al commento che ho fatto sulla domanda originale. Saluti –

0

Vorrei write my own maven plugin per questo. A giudicare dalla tua reputazione e dalla domanda, potresti probabilmente avere qualcosa pronto entro un'ora. Molto probabilmente prima di cercare e provare soluzioni per fare ciò che vuoi.

Problemi correlati