2013-04-03 10 views
18

Ho un progetto Maven e voglio creare due file jar eseguibili da esso. Uno verrà utilizzato in modo interattivo dagli utenti e un secondo verrà eseguito come un processo pianificato che legge i file di registro prodotti dal primo. Alla fine, mi aspetto che i due file jar siano identici tranne per l'attributo Main-Class nel file MANIFEST.MF.Creazione di due jar eseguibili utilizzando maven-assembly-plugin

Sto utilizzando il plug-in maven-antrun per creare un jar eseguibile e sembrava funzionare correttamente finché non ho provato a creare un secondo file jar introducendo i profili Maven. La sezione del mio file POM assomiglia a questo:

<profiles> 
    <profile> 
     <id>publisher</id> 
     <build> 
      <finalName>${project.artifactId}</finalName> 
      <plugins> 
       ... 
       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.4</version> 
        <configuration> 
         <appendAssemblyId>false</appendAssemblyId> 
         <finalName>${project.artifactId}</finalName> 
         <archive> 
          <manifest> 
           <mainClass>fully.qualified.path.Publisher</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
        </configuration> 
        <executions> 
         <execution> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>logReader</id> 
     <build> 
      <finalName>${project.artifactId}</finalName> 
      <plugins> 
       ... 
       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.4</version> 
        <configuration> 
         <appendAssemblyId>false</appendAssemblyId> 
         <finalName>${project.artifactId}-logReader</finalName> 
         <archive> 
          <manifest> 
           <mainClass>fully.qualified.path.LogReader</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
        </configuration> 
        <executions> 
         <execution> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

In realtà, l'unica differenza tra i due è l'elementi "NomeFinale" e "mainClass" come definito all'interno del plugin.

Quando provo a eseguire mvn: pacchetto su entrambi i profili (sto usando IntelliJ IDEA, tra l'altro), ottengo due file .jar, ma uno è corretto e l'altro è errato. Quello "corretto" contiene tutte le dipendenze e un file MANIFEST.MF valido. Quello "errato" non contiene dipendenze e il file MANIFEST.MF non ha la proprietà "Main-Class" di cui ho bisogno per essere eseguibile.

Ho scoperto che se eseguo solo un profilo o l'altro, funziona correttamente ma, se provo ad eseguire entrambi i profili contemporaneamente, fallisce. Ho anche le seguenti note nel mio log, ma devo ammettere che non ho completamente capito quello che stanno dicendo:

[INFO] Building jar: .../target/publisher.jar 
... 
[INFO] Building jar: .../target/publisher-logReader.jar 
[WARNING] Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing. 
Instead of attaching the assembly file: .../target/publisher-logReader.jar, it will become the file for main project artifact. 
NOTE: If multiple descriptors or descriptor-formats are provided for this project, the value of this file will be non-deterministic! 
[WARNING] Replacing pre-existing project main-artifact file: .../target/publisher.jar with assembly file: .../target/publisher-logReader.jar 

Come trovi questo? È possibile produrre due file jar con un singolo mvn: package in questo modo o sto abbaiando dall'albero sbagliato?

Grazie!

risposta

30

Così appena ho postato questo, ho trovato questa discussione:

Create multiple runnable Jars (with depencies included) from a single Maven project

Questo utilizza un approccio diverso nel senso che non fa uso di due profili, utilizza due esecuzioni, come ad esempio:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
     <execution> 
      <id>build-publisher</id> 
      <configuration> 
       <appendAssemblyId>false</appendAssemblyId> 
       <archive> 
        <manifest> 
         <mainClass>fully.qualified.path.Publisher</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>${project.artifactId}</finalName> 
      </configuration> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>build-logReader</id> 
      <configuration> 
       <appendAssemblyId>false</appendAssemblyId> 
       <archive> 
        <manifest> 
         <mainClass>fully.qualified.path.LogReader</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>${project.artifactId}-logReader</finalName> 
      </configuration> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Sembra funzionare. La morale della storia sembra essere che non capisco completamente i profili o quando dovrebbero essere usati.

+1

questa soluzione funziona meglio (almeno per me) rispetto a [questo] (http://stackoverflow.com/a/8726969/288875) a cui mancano gli elementi '' e ''. –

Problemi correlati