2011-10-25 61 views
9

類似的問題here如何將multimodule maven項目組裝成一個WAR?

我想要從3個不同的maven模塊中部署一個結果WAR。戰爭模塊是完全不衝突:

  • 有Java類和一些WEB-INF首先一個/文物

  • 第二個是剛剛API - 接口 - 即必須是已目前在容器或導致戰爭的一部分(這就是我想要的)

  • 第三個與實現類,WEB-INF /工件(春季基礎設施,web.xml文件等)

第一個依賴於接口和實現。第三個取決於接口。

我有可能的選項總亂七八糟。

我是否爲此使用覆蓋?

還是我使用程序集插件來集成第二個類的類?

我使用Cargo plugin

或者如果我指定來自不同模塊的webResources,它是否由maven-war-plugin完成?因爲this dude和我做的幾乎一樣,但是隻有2個戰爭模塊,而且他不使用匯編插件,也不使用疊加....

請告訴我,這是如何正確完成的?

回答

7

這隻需要一點先進的使用maven jar & war插件。

有Java類和一些WEB-INF首先一個/文物

讓我們說這代表了主力戰將。你只需使用maven-war-plugin的Overlays功能。最基本的方法是指定戰爭依賴性:

<dependency> 
     <groupId>${groupId}</groupId> 
     <artifactId>${rootArtifactId}-service-impl</artifactId> 
     <version>${version}</version> 
     <type>war</type> 
     <scope>runtime</scope> 
    </dependency> 

,並告訴Maven的戰爭插件來這種依賴的資產合併到主戰爭(我們現在)

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration> 
     <dependentWarExcludes>WEB-INF/web.xml,**/**.class</dependentWarExcludes> 
     <webResources> 
      <resource> 
       <!-- change if necessary --> 
       <directory>src/main/webapp/WEB-INF</directory> 
       <filtering>true</filtering> 
       <targetPath>WEB-INF</targetPath> 
      </resource> 
     </webResources> 
    </configuration> 
</plugin> 

還包括一個罐子鍵入第二個依賴(這將是一個WEB-INF/lib/ JAR)

<dependency> 
     <groupId>${groupId}</groupId> 
     <artifactId>${rootArtifactId}-service</artifactId> 
     <version>${version}</version> 
     <type>jar</type> 
    </dependency> 

而且你還需要指定從第三戰中的類依賴性:

<dependency> 
     <groupId>${groupId}</groupId> 
     <artifactId>${rootArtifactId}-service-impl</artifactId> 
     <version>${version}</version> 
     <classifier>classes</classifier> 
     <type>jar</type> 
    </dependency> 

注意到分類器,這是必要的,因爲您指定了2個相同的工件的依賴關係...要使其工作,你必須建立在第三神器Jar插件(戰型神器),關於分類器和你需要從一個工件(戰爭& JAR)2包的事實:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <!-- jar goal must be attached to package phase because this artifact is WAR and we need additional package --> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
      <!-- 
       classifier must be specified because we specify 2 artifactId dependencies in Portlet module, they differ in type jar/war, but maven requires classifier in this case 
      --> 
       <classifier>classes</classifier> 
       <includes> 
        <include>**/**.class</include> 
       </includes> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+0

謝謝,很有幫助。起初沒有意識到jar插件實際上必須用在第三個項目的pom文件中。包括它後,所有的工作都很完美。 – AndreiM

相關問題