[英]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,版本,分類器和包裝。
這里發生的事情是:
你的項目有包裝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
然后,您正在使用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]
總結了上面所說的內容。
最后,您聲明了另一個名為do-jar-install
的maven-install-plugin
do-jar-install
,它應該安裝這個本地JAR文件。 這就是它的作用:它使用工件的坐標將target
文件夾中的本地JAR文件安裝到本地Maven存儲庫。 混淆來自於工件的類型(包裝)實際上是WAR,因此安裝的是WAR文件(實際上是JAR)......
現在我們已經解釋了這個問題,問題是:你想做什么? 看起來您想要在WAR項目中附加一個由其類組成的附加工件。 不需要所有這些配置,您只需使用maven-war-plugin
的attachClasses
參數即可。
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
你收到這個是因為插件的雙重調用:
如果沒有強大的理由,而您只關心將一個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.