атрибут webxml требуется с сервлетом 3.0

Я получаю эту ошибку при попытке скомпилировать войну Vaadin:

Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project testvaadin-web: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]

Я знаю, что эта ошибка означает, что maven не может найти мою сеть.XML, но в Книгу "фреймворк Vaadin" он говорит, что web.xml не требуется при использовании Servlet API 3.0 и аннотации @WebServlet в вашем классе пользовательского интерфейса.

я компилирую свои widgetsets в отдельном профиле (согласно этой guide), и он отлично компилируется, когда я rnu этот профиль. Однако, когда я компилирую только веб-проект, я получаю вышеупомянутую ошибку.

что это дает?

Я как-то переопределяю поведение maven? Ваадин даже не создал каталог WEB-INF. Думаю, я мог бы создать папку WEB-INF и сохранить "призрачную" сеть.xml там, чтобы Maven был счастлив, но это не кажется правильным.

Я что-то пропустила?

кто-нибудь знает хорошее решение для этого?

4 ответов


по умолчанию Maven-war-plugin не сможет найти web.xml, см. здесь. Если вы создаете проект Maven с использованием последнего архетипа, вы получите этот параметр равным false:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>

Если вы хотите использовать web.xml вместо аннотаций просто создайте WEB-INF/web.xml и определите сервлет там, см. книгу Vaadin для подробной инструкции.


Я приземлился здесь с аналогичной ошибкой, но используя Eclise Luna (4.4) с Maven 3.0

Я закончил тем, что сделал это:

  1. перемещение WebContent\WEB-INF\web.в XML to в src\главная\Арр\веб-веб-инф\.в XML

  2. использовать <webXml> для указания местоположения web.в XML

<build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.0</version>
              <configuration>
                  <webXml>src\main\webapp\WEB-INF\web.xml</webXml>
              </configuration>
          </plugin>
      </plugins>
      <!-- we dont want the version to be part of the generated war file name -->
      <finalName>${project.artifactId}</finalName>
  </build>
  1. Run mvn пакет и увидеть успех сборки (для Война)

до этого я пытался использовать исходный путь web.в XML

<webXml>WebContent\WEB-INF\web.xml</webXml>

но maven не pickit и лучше всего следовать структуре папок maven

http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html


начиная с версии 3.0.0 на maven-war-plugin работает из коробки без web.xml.

до по крайней мере Maven версии 3.3.9 упаковка war привязывается к более старой версии maven-war-plugin, поэтому вам нужно явно установить версию в вашем pom.xml:

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
        </plugins>
    </build>
</project>

более ранние версии maven-war-plugin у параметр failOnMissingWebXml значение true по умолчанию, что вызывает вашу проблему. См.Сергей Макаров ответ о том, как вручную установить параметр false если вам нужно использовать старую версию плагина.


может быть, вы не следуете стандартному макету каталога maven, как описано здесь макет каталога Maven