web.xml属性在Servlet 3.0中是必需的。

50

我尝试编译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文件,但在“Vaadin之书”中说,当使用Servlet API 3.0和UI类中的注释@WebServlet时,不需要web.xml文件。
我正在根据这个指南在单独的配置文件中编译我的小部件集,当我运行此配置文件时,它可以很好地编译。然而,当我只编译Web项目时,我遇到了上述错误。
这是怎么回事?
我该如何覆盖maven的行为?Vaadin甚至没有创建WEB-INF目录。我想我可以创建WEB-INF文件夹并在其中保留一个“ghost”web.xml文件以使maven正常工作,但那似乎不对。
我有什么遗漏吗?
有人知道解决这个问题的好方法吗?
4个回答

109
默认情况下,如果maven-war-plugin找不到web.xml文件,它会失败。有关详细信息,请参见此处。如果您使用最新的原型创建Maven项目,则会将此参数设置为false:

默认情况下,如果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 并在其中定义 Servlet,详见 Vaadin 之书中的详细说明。

我刚刚找到了它。=)实际上,我的小部件编译中有failOnMissingWebXml。谢谢。 - Roger
我需要将<version>2.4</version>添加到插件中,以消除所有警告。 - Jon
10
请注意,您可以通过将<failOnMissingWebXml>false</failOnMissingWebXml>添加到<properties>部分来更简洁地完成此操作。 - Dan Passaro
只需按照@Sergey Makarov的建议,将上面的代码片段包含在web.xml中的<plugin>标签中,问题就解决了。非常感谢。在那里节省了20分钟。 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> - Ajay

3

我遇到了类似的错误,但是使用的是Eclise Luna(4.4)和Maven 3.0。

最终我做了以下操作:

  1. WebContent\WEB-INF\web.xml移动到src\main\webapp\WEB-INF\web.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. 运行 mvn package 命令,确保构建成功(WAR文件)

在此之前,我尝试使用了原始路径下的web.xml文件。

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

但是Maven没有识别它,最好遵循Maven文件夹结构。你可以参考这个链接:http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

如果您确实需要在同一项目的其他部分中使用web.xml,那么我想这个解决方案可能非常好。 - Roger

1
自版本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,这会导致您的问题。如果您需要使用旧版插件,请参见Sergey Makarov的答案以了解如何手动将该参数设置为false。保留html标签。

0

可能是因为您没有按照这里描述的标准Maven目录布局Maven目录布局进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接