Плагин сборки Maven создает неразборный файл войны - PullRequest
0 голосов
/ 20 апреля 2011

Я работаю над многомодульным проектом с использованием Spring, Hibernate, GWT и Maven 3 и пытаюсь развернуть дистрибутив war-файлов в контейнере сервлетов (предпочтительно Tomcat 7 или Jetty 8).Я создаю war-файл, используя maven-assembly-plugin 2.2.1 (я использую maven 3).Во время сборки maven все работает отлично и создается дистрибутивный архив.

Но когда я пытаюсь развернуть файл war, я получаю ClassNotFound-Exceptions (например, Spring ContextLoaderListener и т. П.), Хотя все на месте (Web-inf / lib и т. П.).Итак, веб-приложение не запускается.Затем я распаковываю war-файл в каталог веб-приложений контейнеров сервлетов, и все работает нормально ... ??

После дальнейшего изучения я наткнулся на следующее: если я возьму произвольный файл войны A ', созданный maven-war-plugin (!), Заменим его содержимое на распакованный контент из файла войны, который я создал с помощьюmaven-assembly-plugin (позвольте мне назвать это 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>

1 Ответ

0 голосов
/ 20 апреля 2011

Плагин maven-assembly-plugin не предназначен для создания войны. Для этого используйте maven-war-plugin .

Если вам нужно создать военные файлы для разных сред, таких как 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>
        <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
...