Maven程序集插件会生成不可部署的war文件

我正在使用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-plugin(!)创建的任意war文件A',请将其内容替换为使用maven-assembly-plugin创建的war文件中的解压缩内容让我称它为A.)我可以看到两件事情发生:

  • 由此产生的战争文件A'比我的原始文件A小几个字节,尽管它们的内容是相同的
  • 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>
    


    maven-assembly-plugin不打算造成战争。 为此,请使用maven-war-plugin。

    如果你需要为不同的环境创建war文件,比如test,qa,production。 这可以作为不同应用程序服务器的基础。 但是如果我们正在讨论应用服务器,这意味着我们应该创建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>
    

    其结果是创建三个不同的战争文件,这些文件可以通过适当的分类器用一次调用区分开来(详细说明可以在这里阅读):

    mvn clean package
    
    链接地址: http://www.djcxy.com/p/29609.html

    上一篇: Maven assembly plugin produces undeployable war file

    下一篇: Deploying assembly package with maven