0

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

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

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

  1. 生成的战争文件 A' 比我的原始文件 A 小几个字节,尽管它们的内容相同
  2. A'的部署突然像一个魅力

这很奇怪,我完全不知道发生了什么。也许有一个问题,maven-war-plugin 和 maven-assembly-plugin 处理战争文件打包的方式不同?!我的意思是,战争只是一个具有一些预定义结构的重命名的 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>

4

1 回答 1

-2

maven-assembly-plugin 不是为了制造战争。为此,请改用maven-war-plugin

如果您需要为不同的环境(如测试、qa、生产)创建战争文件。这也可以用作不同应用服务器的基础。但是如果我们谈论的是应用服务器,这意味着我们应该创建 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 文件,可以通过一个调用来区分它们的适当分类器(详细描述可以在这里阅读):

mvn clean package
于 2011-04-20T15:22:19.967 回答