簡體   English   中英

Maven項目包裝是戰爭,但也建立/安裝jar

[英]Maven project packaging is war but also building/installing jar

我有一個Maven 3.3項目,主要輸出是一個war文件:

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

我正在使用maven插件來構建一個jar文件,該文件進入target/pro-1.0-SNAPSHOT.jar並且這樣可行。

我想將這個jar安裝到本地maven repo,所以我使用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>

整個構建工作正常,除了jar安裝步驟正在安裝戰爭,而不是jar。 我該如何覆蓋它?

我在這里看看我能用什么: http//maven.apache.org/plugins/maven-install-plugin/examples/installing-secondary-artifacts.html

這是我構建的日志:

**

建築罐子:/Users/mike/code/workspace/pro/target/pro-1.0-SNAPSHOT.jar

[INFO] --- maven-install-plugin:2.5.2:install(do-jar-install)@pro

[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 。戰爭

注意最后一行 - 它正在拿起罐子但是安裝戰爭

我該如何解決這個問題?

根據要求,這里是jar插件配置:

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

它在項目中創建了一個jar文件,它是正確的jar。 如果我將我的倉庫中安裝的戰爭復制到一個罐子里 (所以我只是更改了擴展名),我的其他項目就可以把它拿起來。

您當前的輸出是多個考慮因素的結果,其中一個是版本2.4中的maven-jar-plugin太寬松了。

首先,您需要記住,在Maven存儲庫中,所有工件共享一個命名約定,即artifactId-version(-classifier).packaging 這意味着無論您的構建文件的本地名稱是什么(讓它為foo.jar ),它都將被安裝,並將使用此常規名稱進行部署。 安裝工件時最重要的是Maven坐標 ,即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這種方式創建它),這是打包war的Maven項目的主要工件的文件。 相當混亂。

    請記住,我說maven-jar-plugin過於寬松了? 如果您更新到插件的3.0.2版,則會在此處收到錯誤( MJAR-198 ):

    您必須使用分類器將補充工件附加到項目而不是替換它們。 - > [幫助1]

    總結了上面所說的內容。

  3. 最后,您聲明了另一個名為do-jar-installmaven-install-plugin do-jar-install ,它應該安裝這個本地JAR文件。 這就是它的作用:它使用工件的坐標將target文件夾中的本地JAR文件安裝到本地Maven存儲庫。 混淆來自於工件的類型(包裝)實際上是WAR,因此安裝的是WAR文件(實際上是JAR)......


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

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

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

  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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM