В 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 счастливым, но это не кажется правильным.
Я что-то пропустил?
Кто-нибудь знает хорошее решение для этого?
Ответы
Ответ 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>
- Запустите 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