2013-04-03 89 views
18

我有一個Maven項目,我想用它創建兩個可執行的JAR文件。一個將被用戶以交互方式使用,另一個將作爲預定作業運行,讀取前者生成的日誌文件。最後,我希望這兩個jar文件是除了在MANIFEST.MF文件中的Main-Class屬性相同。創建兩個可執行罐子使用maven組件,插件

我使用maven-antrun-插件來創建一個可執行的JAR,這似乎是工作的罰款,直到我試圖通過引入Maven的配置文件,以創建第二個jar文件。我的POM文件的相關部分如下所示:

<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> 

真的,兩者之間的唯一區別是因爲插件中定義的「finalName」和「mainClass」元素。

當我試圖在兩個配置文件(我使用IntelliJ IDEA,順便說一句)上執行mvn:package時,我得到兩個.jar文件,但一個是正確的,另一個是不正確的。 「正確的」包含所有依賴項和一個有效的MANIFEST.MF文件。在「不正確」一個不包含任何依賴性和MANIFEST.MF文件缺少「主類」屬性,我需要爲了它是可執行的。

我發現,如果我只運行一個配置文件或其他,它工作正常,但如果我嘗試一次執行這兩個配置文件,它失敗。我也得到我的日誌中的下列事項,但我必須承認,我完全不懂他們在說什麼:

[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 

這個有什麼想法?是否有可能產生兩個jar文件與單個MVN:包這樣,還是我找錯了樹?

謝謝!

回答

30

因此,一旦我貼這個,我發現這個線程:

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

這將使用不同的方法,因爲它不使用兩個配置文件,它使用兩個執行,因爲這樣的:

<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> 

這似乎是工作。故事的寓意似乎是,我不完全理解配置文件或何時應該使用它們。

+1

與[缺少''和''元素的[this]](http://stackoverflow.com/a/8726969/288875)相比,此解決方案效果更好(至少對我來說)效果更好。 – 2013-06-25 12:25:29