web-dev-qa-db-fra.com

l'attribut webxml est requis avec Servlet 3.0

Je reçois cette erreur en essayant de compiler un WAR 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]

Je sais que cette erreur signifie que maven ne peut pas trouver mon web.xml, mais dans le "Livre de Vaadin", il est indiqué que web.xml n'est pas nécessaire lors de l'utilisation de Servlet API 3.0 et de l'annotation @WebServlet dans votre classe d'interface utilisateur. 

Je suis en train de compiler mes widgets dans un profil séparé (selon this guide) et la compilation est correcte lorsque je suis ce profil. Cependant, lorsque je ne compile que le projet Web, j'obtiens l'erreur mentionnée ci-dessus.

Ce qui donne?

Est-ce que je remplace le comportement maven d'une manière ou d'une autre? Vaadin n'a même pas créé de répertoire WEB-INF. Je suppose que je pourrais créer un dossier WEB-INF tout en conservant un "fantôme" web.xml afin que Maven reste heureux, mais cela ne semble pas bien. 

Est-ce que je manque quelque chose?

Est-ce que quelqu'un connaît une bonne solution à cela?

48
Roger

Par défaut, maven-war-plugin échouera s’il ne trouve pas le fichier web.xml, voir ici . Si vous créez un projet Maven en utilisant le dernier archétype, vous définissez ce paramètre sur false:

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

Si vous souhaitez utiliser web.xml à la place des annotations, créez simplement WEB-INF/web.xml et définissez le servlet à cet emplacement. Voir Book of Vaadin pour des instructions détaillées.

106
Sergey Makarov

J'ai atterri ici avec une erreur similaire mais en utilisant Eclise Luna (4.4) avec Maven 3.0

J'ai fini par faire ceci:

  1. déplacez WebContent\WEB-INF\web.xml vers src\main\webapp\WEB-INF\web.xml

  2. Utilisez le <webXml> pour spécifier l'emplacement de 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. Exécutez mvn package et voyez un message BUILD SUCCESS (pour WAR).

Avant cela, j'avais essayé d'utiliser le chemin d'origine du fichier web.xml

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

Mais Maven n’a pas repris le flambeau et il est préférable de suivre la structure du dossier Maven.

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

Depuis la version 3.0.0, le maven-war-plugin fonctionne sans web.xml.

Jusqu'à au moins la version 3.3.9 de Maven, le package warest lié à une version antérieure du maven-war-plugin , vous devez donc définir explicitement la version dans votre 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>

Dans les versions précédentes du maven-war-plugin, le paramètre failOnMissingWebXml était défini sur true par défaut, ce qui provoquait votre problème. Voir Sergey Makarovs answer sur la manière de définir manuellement le paramètre sur false si vous devez utiliser une version plus ancienne du plugin.

1
siegi

Il se peut que vous ne suiviez pas la disposition de répertoire maven standard décrite ici - Disposition de répertoire Maven

0
ACV