Maven程序集插件生成无法部署的war文件

时间:2011-04-20 15:15:30

标签: deployment packaging war maven-assembly-plugin

我正在使用Spring,Hibernate,GWT和Maven 3开发一个多模块项目,并尝试将war-file分发部署到servlet容器(最好是Tomcat 7或Jetty 8)。我使用maven-assembly-plugin 2.2.1(我正在运行maven 3)创建war文件。在maven构建期间,一切都运行良好,并创建分发存档。

但是当我尝试部署war文件时,我得到了ClassNotFound-Exceptions(例如Spring ContextLoaderListener等),尽管一切都已到位(Web-inf / lib等.pp。)。所以,webapp没有启动。然后我将war文件解压缩到servlet容器的webapp目录中,一切正常......

经过进一步调查后,我发现了以下情况: 如果我采用由maven-war-plugin(!)创建的任意war文件A',将其内容替换为我使用maven-assembly-plugin创建的war文件中的解压缩内容(让我称之为 A.)我可以看到两件事情发生:

  1. 生成的war文件A'比我原来的文件A小几个字节,尽管它们的内容相同
  2. A'的部署突然像魅力一样
  3. 这很奇怪,我完全不知道发生了什么。也许有一个问题,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>
    

1 个答案:

答案 0 :(得分:-2)

maven-assembly-plugin并非旨在制造战争。为此,请使用maven-war-plugin代替。

如果您需要为test,qa,production等不同环境创建war文件。这可以用作不同app服务器的基础。但是,如果我们谈论应用服务器,这意味着我们应该创建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-assembly-plugin的时间,如下所示:

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

结果是创建了三个不同的war文件,可以通过一个调用(detailed description can be read here)通过适当的分类器来区分:

mvn clean package