2016-07-30 70 views
2

我有一個Maven 3.3項目,主要輸出是一個WAR文件:Maven項目包裝是戰爭,而且建築/安裝JAR

<artifactId>pro</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>war</packaging> 

我使用maven插件還建立一個jar文件,這進入target/pro-1.0-SNAPSHOT.jar和這個作品。

我想安裝這個罐子本地Maven回購,所以我使用的Maven插件安裝要做到這一點:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <version>2.5.2</version> 
    <configuration> 
     <classifier>jar</classifier> 
     <packaging>jar</packaging> 
     <file>target/pro-1.0-SNAPSHOT.jar</file> 
    </configuration> 
    <executions> 
     <execution> 
      <id>do-jar-install</id> 
      <phase>install</phase> 
      <goals> 
       <goal>install</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

整個建造工作正常,除了罐安裝步驟安裝戰爭,而不是罐子。我如何覆蓋這個?

我期待在這裏看到,我可以用什麼:http://maven.apache.org/plugins/maven-install-plugin/examples/installing-secondary-artifacts.html

這裏是我的生成日誌:

**

大廈罐子:/用戶/麥克風/碼/workspace/pro/target/pro-1.0-SNAPSHOT.jar

[INFO] --- Maven的安裝,插件:2.5.2:安裝(DO-JAR安裝)@親

[INFO]將/Users/mike/code/workspace/pro/target/pro-1.0-SNAPSHOT.jar安裝到/Users/mike/.m2/repository/net/mikeski/pro/1.0-SNAPSHOT/pro-1.0 -SNAPSHOT.war

注意最後一行 - 它拿起罐子安裝戰爭

我該如何解決呢?

按照要求,這裏是罐子插件配置:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
     <execution> 
      <id>create-jar</id> 
      <phase>install</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

它創造了該項目的文件的罐子,這是正確的罐子。如果我將安裝在我的回購庫中的war複製到jar(所以我只是更改擴展名),我的其他項目可以很好地撿起它。

回答

3

您當前的輸出是多重考慮的結果,其中之一是maven-jar-plugin在版本2.4中也過分寬容。

首先,您需要記住,在Maven倉庫中,所有工件共享一個命名約定,即artifactId-version(-classifier).packaging。這意味着無論您的版本生成的文件的本地名稱是什麼(假設它是foo.jar),它都將被安裝,並且將使用該常規名稱進行部署。安裝工件時的所有問題都是Maven coordinates,即groupId,artifactId,版本,分類器和打包。

這裏發生的事情是:

  1. 你的項目有一個包裝war。使用mvn install運行Maven,將首先調用default-install階段,並且首次運行maven-install-plugin:install目標,即安裝WAR項目。在你的日誌,你會發現:

    [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ test-war --- 
    [INFO] Installing ...\test-war\target\test-war-0.0.1-SNAPSHOT.war to ...\test-war\0.0.1-SNAPSHOT\test-war-0.0.1-SNAPSHOT.war 
    [INFO] Installing ...\test-war\pom.xml to ...\test-war\0.0.1-SNAPSHOT\test-war-0.0.1-SNAPSHOT.pom 
    
  2. 然後,您使用的是maven-jar-plugin:jar目標是建立一個JAR。這個插件爲當前的Maven項目創建了一個JAR--所以它會創建它,但這個新工件的Maven座標將與WAR項目的Maven座標完全相同(您沒有指定classifier)。因此,您通過JAR文件有效地替換了主工件(這是一個WAR)的文件:最終得到一個擴展名爲jar的本地文件(因爲maven-jar-plugin以這種方式創建了該文件) Maven項目的主要工件包裝war。非常混亂。

    請記住,我說過maven-jar-plugin太寬鬆了嗎?如果更新的插件3.0.2版本,你會得到一個錯誤就在這裏(MJAR-198):

    你必須使用一個分類來補充文物重視該項目,而不是取代它們。 - > [Help 1]

    其中總結了上述內容。

  3. 最後,您聲明maven-install-plugin的另一個執行,稱爲do-jar-install,即應該安裝此本地JAR文件。這就是它所做的:它使用工件的座標將本地JAR文件安裝到您的本地Maven存儲庫的target文件夾中。這種混亂來自於一個事實,即工件類型(包裝)實際上是戰爭,那麼將安裝哪些功能是一個WAR文件(即實際上是JAR)...


現在我們已經解釋了這個問題,問題是:你想做什麼?它看起來像你想附加到你的WAR項目一個額外的工件組成的類。不需要所有這些配置,只需使用maven-war-pluginattachClasses參數即可。

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
    <attachClasses>true</attachClasses> 
    </configuration> 
</plugin> 
+0

謝謝,我真正需要做的是獨立的我的實體和接口,一個單獨的Maven的模塊,並使用了這兩個項目。這是問題的正確答案,但不是解決我的問題的方法。 – mikeb

0

你收到這是因爲插件的雙重調用:

  1. 執行階段
  2. 包 - 缺相

如果沒有強有力的理由和您所關心的是有隻有一個JAR作爲項目中的人工產物,使用其中的一個。

類似:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <outputDirectory>${outputDirectory}</outputDirectory> 
     </configuration> 
</plugin>