2012-01-04 7 views
23

Ho un singolo progetto Maven che ha più classi principali. Voglio generare giare eseguibili (che includono le dipendenze) da questi progetti. Al momento ho la seguente configurazione di generazione (utilizzando maven.assembly):Creare più giare eseguibili (con le distribuzioni incluse) da un singolo progetto Maven

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <mainClass>classpath.to.my.mainClass</mainClass> 
       </manifest> 
      </archive> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
</plugins> 
</build> 

È loro un modo per raggiungere questo obiettivo con Maven-montaggio? In caso contrario, qual è il modo più semplice per raggiungere il mio obiettivo?

+0

Hai provato a creare diverse voci '' per 'maven-assembly-plugin' con diverse configurazioni? Questo attiverà questo plugin due volte e creerà due file JAR con speranza ... –

+0

@dma_k Seguendo il tuo suggerimento, provando a generare tre JAR, i primi due vengono sovrascritti dall'ultima configurazione ''. – anon

+0

Prova a giocare con l'opzione di configurazione '' (controlla [qui] (http://maven.apache.org/plugins/maven-assembly-plugin/howto.html)). –

risposta

18

non ero in grado di risolvere questo problema con il maven-assembly-plugin in modo soddisfacente, così sono andato per una soluzione diversa. Ho usato il onejar-maven-plugin:

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.dstovall</groupId> 
    <artifactId>onejar-maven-plugin</artifactId> 
    <version>1.4.4</version> 
    <executions> 
     <execution> 
     <id>build-first</id> 
      <configuration> 
      <mainClass>classpath.to.first.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>first-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     <execution> 
     <id>build-second</id> 
      <configuration> 
      <mainClass>classpath.to.second.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>second-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

<pluginRepositories> 
    <pluginRepository> 
    <id>onejar-maven-plugin.googlecode.com</id> 
    <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
    </pluginRepository> 
</pluginRepositories> 
+1

i due 'id' nei due' execution's non dovrebbero differire? Il mio maven si lamenta se ho lo stesso id più di una volta. –

+0

@AndreHolzner: Sì, questo era un errore –

+1

IMHO, la stessa cosa è possibile con maven-assembly-plugin. Vedi @ donal-fellows answer – Gabriel

19

Puoi farlo. Avrai bisogno di un'esecuzione separata per ogni artefatto che stai creando (cioè, dai a ciascuno il proprio id ma puoi lasciare la fase come predefinita), e dovrai specificare il finalName e l'archive/manifest/mainClass per ogni.

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>build-a</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Aclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_a.jar</finalName> 
      </configuration> 
      </execution> 
      <execution> 
      <id>build-b</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Bclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_b.jar</finalName> 
      </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
+2

Probabilmente dovrebbe anche dichiarare esplicitamente che l'obiettivo 'single' deve essere usato. –

+3

provando questa soluzione e quella [pubblicata qui] (http://stackoverflow.com/a/15799254/288875), sembra che sia necessario aggiungere anche i tag '' e ''? –

+0

Ho modificato il post (in attesa di revisione tra pari) per includere obiettivi e tag di fase. – Gabriel

1

Per specificare un po 'più risposta precedente che è stato molto utile per me, è necessario aggiungere il pacchetto di fase e di assemblaggio obiettivo ed eseguire mvn correre pacchetto pulito, pom è la seguente:

<plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>build-a</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>firstMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>a.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>build-b</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>SecondMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>b.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+2

Goal 'assembly' è deprecato. Vedi [informazioni sul plugin] (https://maven.apache.org/plugins/maven-assembly-plugin/plugin-info.html). Meglio usare 'single' invece. – Gabriel

6

The top answer funziona se non si utilizza alcuna configurazione (o qualsiasi risorsa, in questo caso) che viene fornito in bundle nel file jar (ad esempio, la configurazione di Spring Framework auto-binding).

Fortunatamente, questa soluzione funziona anche con maven-shade-plugin e non si dispone di tale problema con onejar-maven-plugin.

Inoltre, maven-shade-plugin viene mantenuto attivamente rispetto a onejar-maven-plugin che si trova nel purgatorio che è googlecode.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
    <execution> 
     <id>build-first</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.first.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>first-runnable</finalName> 
     </configuration>   
    </execution> 
    <execution> 
     <id>build-second</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.second.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>second-runnable</finalName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin>