webentwicklung-frage-antwort-db.com.de

das webxml-Attribut ist bei Servlet 3.0 erforderlich

Ich erhalte diese Fehlermeldung, wenn ich versuche, einen Vaadin WAR zu kompilieren:

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]

Ich weiß, dass dieser Fehler bedeutet, dass maven meine web.xml nicht finden kann. Im "Book of Vaadin" heißt es jedoch, dass web.xml nicht erforderlich ist, wenn Servlet API 3.0 und Annotation @WebServlet in Ihrer UI-Klasse verwendet werden. 

Ich kompiliere meine Widgetsets in einem separaten Profil (gemäß this guide) und es ist gut, wenn ich dieses Profil erstelle. Wenn ich jedoch nur das Web-Projekt kompiliere, erhalte ich den oben genannten Fehler.

Was gibt?

Überschreite ich das Verhalten von Maven irgendwie? Vaadin hat nicht einmal ein WEB-INF-Verzeichnis erstellt. Ich denke, ich könnte einen WEB-INF-Ordner erstellen und dort eine "ghost" web.xml behalten, um maven bei Laune zu halten, aber das scheint nicht richtig zu sein. 

Fehlt mir etwas?

Kennt jemand eine gute Lösung dafür?

48
Roger

Standardmäßig schlägt das Maven-War-Plugin fehl, wenn web.xml nicht gefunden wird. Siehe hier . Wenn Sie ein Maven-Projekt mit dem neuesten Archetyp erstellen, wird dieser Parameter auf false gesetzt:

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

Wenn Sie web.xml anstelle von Anmerkungen verwenden möchten, erstellen Sie einfach WEB-INF/web.xml und definieren Sie dort das Servlet. Eine detaillierte Anleitung finden Sie in Book of Vaadin.

106
Sergey Makarov

Ich bin hier mit einem ähnlichen Fehler gelandet, habe aber Eclise Luna (4.4) mit Maven 3.0 verwendet

Ich endete damit:

  1. verschieben Sie WebContent\WEB-INF\web.xml in src\main\webapp\WEB-INF\web.xml.

  2. Verwenden Sie den <webXml>, um den Speicherort von web.xml anzugeben

<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. Führen Sie das mvn-Paket aus und sehen Sie einen BUILD SUCCESS (für WAR).

Vorher habe ich versucht, den ursprünglichen Pfad der Datei web.xml zu verwenden

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

Aber Maven hat nicht aufgegriffen und folgt am besten der Ordnerstruktur von Maven

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

Seit Version 3.0.0 arbeitet der maven-war-plugin aus der Box ohne web.xml.

Bis mindestens Maven Version 3.3.9 bindet die Verpackung waran eine ältere Version von maven-war-plugin , sodass Sie die Version explizit in Ihrem pom.xml einstellen müssen:

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

In früheren Versionen von maven-war-plugin war der Parameter failOnMissingWebXml standardmäßig auf true gesetzt, was das Problem verursacht. Siehe Sergey Makarovs answer , wie Sie den Parameter manuell auf false setzen, wenn Sie eine ältere Version des Plugins verwenden möchten.

1
siegi

Möglicherweise folgen Sie nicht dem Standard-Maven-Verzeichnislayout wie hier beschrieben Maven-Verzeichnislayout

0
ACV