В Servlet 3.0 требуется атрибут webxml. - программирование
Подтвердить что ты не робот

В Servlet 3.0 требуется атрибут webxml.

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

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 не может найти мой web.xml, но в "Книге Ваадина" говорится, что web.xml не требуется при использовании Servlet API 3.0 и Annotation @WebServlet в вашем пользовательском интерфейсе.

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

Что дает?

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

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

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

4b9b3361

Ответ 1

По умолчанию 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 и определите сервлет там, см. "Книга Ваадина" для подробной инструкции.

Ответ 2

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

Я закончил это:

  • переместите WebContent\WEB-INF\web.xml на src\main\webapp\WEB-INF\web.xml

  • Используйте <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. Запустите mvn package и посмотрите УСПЕХ СТРОЙ (для ВОЙНЫ)

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

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

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

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

Ответ 3

Начиная с версии 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, если вам нужно использовать более старую версию плагина.

Ответ 4

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