2011-04-20 94 views
0

我正在使用Spring,Hibernate,GWT和Maven 3開發一個多模塊項目,並嘗試將一個war文件分發部署到servlet容器(最好是Tomcat 7或Jetty 8)。我使用maven-assembly-plugin 2.2.1創建war文件(我正在運行maven 3)。在Maven構建過程中,所有工作都非常完美,並創建了分發存檔。但是當我嘗試部署戰爭文件時,雖然一切都已到位(Web-inf/lib等),但我得到了ClassNotFound-Exceptions(例如Spring ContextLoaderListener等)。所以,webapp不會啓動。然後我將war-file解包到servlet容器的webapp目錄中,一切工作正常......?Maven程序集插件產生不可部署的war文件

經過進一步調查,我發現了以下內容: 如果我使用maven-war-plugin(!)創建的任意war文件A',將其內容替換爲使用maven創建的war文件中的解壓內容 - 裝配 - 插件(讓我把它叫做 A.),我可以看到兩件事情:

  1. 生成的WAR文件」比我原來的文件更小的幾個字節,雖然它們的內容是相同的
  2. A'的調配突然像魅力一樣工作

這很奇怪,我完全不知道發生了什麼。也許有一個問題,maven-war-plugin和maven-assembly-plugin處理war文件的打包方式不同?!我的意思是,一場戰爭只是一個帶有一些預定義結構的重命名的zip文件...也許它與maven完全沒有關係,但與文件編碼或其他東西?對此有何想法?我明白任何提示,可以幫助我在調查這個...

這是我的裝配描述

<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
<id>dist</id> 
<formats> 
    <format>war</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 

<dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <includes> 
      <include>mypackage.client:parametermgmt:*</include> 
      <include>mypackage.static:client:*</include> 
     </includes> 
     <useProjectArtifact>false</useProjectArtifact> 
     <outputDirectory>/</outputDirectory> 
    </dependencySet> 

    <dependencySet> 
     <unpack>false</unpack> 
     <includes> 
      <include>mypackage.server.database:domain:*</include> 
      <include>mypackage.server.businessobjects:BOdomain:*</include> 
      <include>mypackage.server.security:security:*</include> 
      <include>mypackage.server.services:paramgmt:*</include> 
     </includes> 
     <useProjectArtifact>false</useProjectArtifact>  
     <outputDirectory>Web-inf/lib</outputDirectory> 
    </dependencySet> 

    <dependencySet> 
     <unpack>true</unpack> 
     <includes> 
      <include>mypackage.static:server:*</include> 
     </includes> 
     <useProjectArtifact>false</useProjectArtifact> 
     <outputDirectory>/</outputDirectory> 
    </dependencySet> 

    <dependencySet> 
     <unpack>false</unpack> 
     <includes> 
      <include>*</include> 
     </includes> 
     <excludes> 
      <exclude>mypackage.*</exclude> 
     </excludes> 
     <scope>runtime</scope> 
     <useProjectArtifact>false</useProjectArtifact> 
     <outputDirectory>Web-inf/lib</outputDirectory> 
    </dependencySet> 

</dependencySets> 

回答

-2

的Maven的組裝插件不打算創建一個戰。爲此,請使用maven-war-plugin

如果您需要爲不同的環境(如test,qa,production)創建war文件。這可以作爲不同應用程序服務器的基礎。但是如果我們正在討論應用服務器,這意味着我們應該創建ear文件而不是war文件(這意味着使用maven-ear-plugin而不是maven-war-plugin)。

|-- pom.xml 
`-- src 
    |-- main 
    | |-- java 
    | |-- resources 
    | |-- environment 
    | | |-- test 
    | | | `-- database.properties 
    | | |-- qa 
    | | | `-- database.properties 
    | | `-- production 
    | |  `-- database.properties 
    | `-- webapp 

您需要對下面的組件(在任何環境),它可以在此基礎上爲模板創建:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 

    <id>test</id> 
    <formats> 
    <format>war</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <useProjectArtifact>true</useProjectArtifact> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <outputDirectory>WEB-INF</outputDirectory> 
     <directory>${basedir}/src/main/environment/test/</directory> 
     <includes> 
     <include>**</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 

爲了支持不同的環境不同的文物,這是對時間Maven的組裝插件這樣的:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>test</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <descriptors> 
       <descriptor>${project.basedir}/src/main/assembly/test.xml</descriptor> 
       </descriptors> 
      </configuration> 
      </execution> 
      <execution> 
      <id>qa</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <descriptors> 
       <descriptor>${project.basedir}/src/main/assembly/qa.xml</descriptor> 
       </descriptors> 
      </configuration> 
      </execution> 
      <execution> 
      <id>production</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <descriptors> 
       <descriptor>${project.basedir}/src/main/assembly/production.xml</descriptor> 
       </descriptors> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 

結果產生可以通過其相應的分類與SINGL來區分三種不同的戰爭文件電話():

mvn clean package 
+3

如果不打算創建戰爭,那麼它爲什麼會提供支持的格式? – 2011-06-29 04:35:45

+0

Thx爲您的答覆。程序集插件可用於[生成war文件,因爲它可用於生成zip,dir,tar。gz和其他格式。](http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-descriptor.html)我傾向於使用它除了戰爭插件,因爲我想要一個細粒度的控制裝配過程和最終的戰爭內容。另一種選擇是使用war war oyerlays,但不幸的是這對我不起作用,因爲Web-inf/classes之外的所有依賴戰爭內容都被省略,即在解壓依賴戰爭時迷路了。也許我錯過了一些 – holger 2011-04-20 16:21:41

+0

如果你想爲不同的應用程序服務器產生不同的戰爭,你怎麼能用maven-war-plugin來實現這一點? – maks 2012-10-04 15:52:39