【问题标题】:"webxml attribute is required" error in MavenMaven 中的“需要 webxml 属性”错误
【发布时间】:2011-07-18 03:22:23
【问题描述】:

我收到以下错误:

组装 WAR 时出错:需要 webxml 属性(如果在更新模式下执行,则需要预先存在的 WEB-INF/web.xml)

我在正确的位置找到了web.xml,即projectname\src\main\webapp\WEB-INF\web.xml

这可能是什么原因造成的?

【问题讨论】:

  • 你的包装在 pom 中是否准备好了?
  • 我遇到了同样的问题,更新插件版本解决了。

标签: maven war


【解决方案1】:

这是一个老问题,答案很多,大部分都会或多或少有帮助;但是,有一个非常重要且仍然相关的点,没有一个答案涉及(相反,提供了不同的技巧来使构建成为可能),而且我认为它的重要性丝毫不亚于......相反.

根据您的日志信息,您使用的是项目管理工具Maven,严格遵循conventions, over configuration原则。

Maven 构建项目时:

  1. 它希望您的项目具有特定的目录结构,以便它知道在哪里可以期待什么。这称为Maven's Standard Directory Layout
  2. 在构建期间,它还会创建适当的目录结构并将文件放置到相应的位置/目录中,这符合 Java EE [web] 应用程序的 Sun Microsystems Directory Structure Standard

您可以合并许多东西,包括 maven 插件、更改/重新配置项目根目录等,但更好和更容易的是遵循配置的默认约定,根据该约定,(现在是您问题的答案)那里一个简单的步骤可以使您的项目工作:只需将您的 web.xml 放在 src\main\webapp\WEB-INF\ 下,然后尝试使用 mvn package 构建项目。

【讨论】:

    【解决方案2】:

    确保在编译你的战争之前运行mvn install

    【讨论】:

      【解决方案3】:

      根据文档,它说:如果 web.xml 文件丢失,是否使构建失败。如果您希望在没有 web.xml 文件的情况下构建 WAR,请设置为 false。如果您正在构建没有 web.xml 文件的覆盖,这可能很有用。 默认值为:真。 用户属性为:failOnMissingWebXml。

      <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.1.1</version>
          <extensions>false</extensions>
          <configuration>
              <failOnMissingWebXml>false</failOnMissingWebXml>
          </configuration>
      </plugin>
      

      希望它更清楚

      【讨论】:

        【解决方案4】:

        它也对我有用。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webXml>WebContent\WEB-INF\web.xml</webXml>
            </configuration>
        </plugin>
        

        【讨论】:

        • 它有效,但日志现在显示:WEB-INF\web.xml already added, skipping。这很奇怪,当我不添加这个时,我得到了错误。
        • 与 erwineberhard 相同。 WEB-INF\web.xml already added, skipping
        【解决方案5】:
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        

        这个解决方案对我有用(我之前使用的是 2.2)。另外,我正在为 Servlet 3.0 使用基于 Java 的配置,并且不需要 web.xml 文件。

        【讨论】:

        • 该插件的 3.x 版本现在将 failOnMissingWebXml 默认设置为 false。所以,&lt;plugin&gt; &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt; &lt;version&gt;3.2.3&lt;/version&gt; &lt;/plugin&gt; 就足够了。
        • 像以前一样为我工作,并且仍在使用 jboss-web.xml - 谢谢!
        • 我有一个没有 web.xml 的项目,这对我有用。 Maven 构建成功。
        【解决方案6】:

        ? failOnMissingWebXml 自 2020 年起

        关于the default value used by the maven-war-plugin changed的所有其他答案可能已过时:

        从 3.1.0 开始,如果项目依赖于 Servlet 3.0 API 或更高版本,则此属性默认为 false。

        所以你要做的唯一就是添加

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        

        示例:

        <project xmlns="http://maven.apache.org/POM/4.0.0"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                http://maven.apache.org/xsd/maven-4.0.0.xsd">
        
            <modelVersion>4.0.0</modelVersion>
            <groupId>foo</groupId>
            <artifactId>bar</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <properties>
                <tomcat.ignorePackaging>true</tomcat.ignorePackaging>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>3.1.0</version>
                </dependency>
            </dependencies>
            <build>
                <pluginManagement>
                    <plugins>
                        <plugin>
                            <artifactId>maven-war-plugin</artifactId>
                            <version>3.1.0</version>
                        </plugin>
                    </plugins>
                </pluginManagement>
            </build>
        </project>
        

        【讨论】:

          【解决方案7】:

          出现此错误是因为您告诉 Maven 将文件打包到 war

          <packaging>war</packaging>
          

          你真的需要战争吗?如果没有,把罐子放在那里。 这是完整的代码:

          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          
              <modelVersion>4.0.0</modelVersion>
              <version>1.0-SNAPSHOT</version>
          
              <groupId>com.your.groupid</groupId>
              <artifactId>artifactid</artifactId>
              <packaging>jar</packaging>
          

          【讨论】:

          • 罐子和战争是完全不同的故事。我认为这里需要战争,因为存档正在部署到 Web 容器中,并且没有作为独立的 jar 应用程序单独运行。
          【解决方案8】:

          我遇到了完全相同的问题,我是这样解决的:

          然后在src/main/webbapp下新建一个文件夹WEB-INF

          右键单击您的项目 -> Java EE 工具 -> 生成部署描述符存根

          这应该会生成您的web.xml

          我希望这有助于解决您的问题:D

          【讨论】:

            【解决方案9】:

            这是因为你没有在你的 web 项目中包含 web.xml 并试图使用 maven 构建战争。要解决此错误,您需要在 pom.xml 文件中将 failOnMissingWebXml 设置为 false

            例如:

            <properties>
                <failOnMissingWebXml>false</failOnMissingWebXml>   
            </properties>
            

            更多详情请查看博客:https://ankurjain26.blogspot.in/2017/05/error-assembling-war-webxml-attribute.html

            【讨论】:

              【解决方案10】:

              我在测试服务器上遇到了同样的错误,但在本地没有。几分钟后,我发现 IDE 没有与 pom.xml 同步。这是我的解决方法:

              用 Eclipse 重新生成部署描述符

              1. 右键单击您的项目文件夹
              2. 在上下文菜单中,选择“Java EE 工具”,然后选择“生成部署描述符存根”
              3. 它将创建 web.xml。

              使用 IntelliJ 重新生成部署描述符

              1. 右键单击您的项目文件夹
              2. 在上下文菜单中,选择“打开模块设置”,然后单击 + 以添加 Web 部署描述符。
              3. 然后您可以更改描述符的路径Web资源目录以及右侧的。
              4. 然后你会得到类似:

              【讨论】:

              • 在 netbeans 中,您可以:右键单击项目节点 > 新建 > 其他 > Web > 标准部署描述符 (web.xml)。
              【解决方案11】:

              您的文件夹结构是否已更改,因此文件不再位于 /src/main/webapp/WEB-INF/web.xml 中?

              为了解决这个问题,我将我的 web 文件夹命名为 webapp,并将其放在 src/main.xml 中。默认情况下,Maven 似乎在 /src/main/webapp/WEB-INF/web.xml 中查找 web.xml。如果你这样做,那么你不需要明确告诉 maven web.xml 在哪里。如果您更改了文件夹结构并且您的构建最近停止工作,这可能就是原因。

              注意:这是一篇旧帖子,但发布的解决方案没有指出为什么工作构建会突然停止工作。

              【讨论】:

                【解决方案12】:

                如果你能提供你的 maven-war-plugin 的代码 sn-p 将会很有帮助。 看起来web.xml 在正确的位置,您仍然可以尝试明确给出位置

                <plugin>            
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-war-plugin</artifactId>
                  <configuration>
                    <webXml>src\main\webapp\WEB-INF\web.xml</webXml>        
                  </configuration>
                </plugin>
                

                【讨论】:

                • 也为我工作,谢谢。但是 Maven 搜索的默认位置是什么?
                • 我刚刚将 maven war 插件从 2.1.1 更新到 2.4,不再需要明确默认位置。
                • 您可能希望为 ItelliJ IDEA 用户更新您的答案 - IntelliJ 创建另一个项目结构,因此它将是 web\WEB-INF\web.xml
                • 试过你的答案,但仍然得到同样的错误,而不是我做了这个 "C:\Users\xxxx\Videos\maven-projects\my-project\src\webapp\WEB-INF" 和工作得很好。我不知道是什么问题。这是我的运气。谢谢
                【解决方案13】:

                如果您正在从基于 XML 的配置迁移到基于 Java 的配置,并且通过实现 WebApplicationInitializer 消除了对 web.xml 的需求,则只需消除对存在 web.xml 文件的需求。

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.6</version>
                    <configuration>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
                        ... 
                    </configuration>
                

                【讨论】:

                • 之前给出了类似的答案
                • 这个给出了上下文,该行需要去哪里。
                【解决方案14】:

                mvn-war-plugin 2.3 修复了这个问题:

                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-war-plugin</artifactId>
                            <version>2.3</version>
                        </plugin>
                        ...
                

                【讨论】:

                  【解决方案15】:

                  如果更改默认项目路径,则必须指定web.xml文件的位置,例如:

                          <plugin>
                              <groupId>org.apache.maven.plugins</groupId>
                              <artifactId>maven-war-plugin</artifactId>
                              <version>2.5</version>
                              <configuration>
                                  <webXml>src\main\web\WEB-INF\web.xml</webXml>
                              </configuration>
                          </plugin>
                  

                  【讨论】:

                    【解决方案16】:

                    确保 pom.xml 正确放置在 Project 文件夹中。而不是在目标文件夹或其他任何地方。

                    看起来 pom.xml 没有相对对齐。

                    【讨论】:

                      【解决方案17】:

                      看起来您的 web.xml 确实位于正确的位置,但即便如此,此错误通常是由于目录结构与 Maven 期望看到的不匹配造成的。例如,如果您从尝试使用 Maven 构建的 Eclipse Web 应用开始。

                      如果这是问题所在,快速解决方法是创建一个
                      src/main/java 和一个
                      src/main/webapp 目录(以及其他目录,如果您需要它们)并移动您的文件。

                      这里是 maven 目录布局的概述: http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

                      【讨论】:

                        【解决方案18】:

                        我的 webXml 标记的值需要看起来像这样才能工作:

                        <webXml>${project.basedir}\src\main\webapp\WEB-INF\web.xml</webXml> 
                        

                        【讨论】:

                        • 没错!直到我看到我在开头只有一个斜线时才弄清楚&lt;warSourceDirectory&gt;\src\main\webapp&lt;/warSourceDirectory&gt; 不起作用!不在 v2.6 中
                        【解决方案19】:

                        它也适合我。

                        <project>
                        
                        .....
                        
                            <build>
                                <plugins>
                                    <plugin>
                                        <groupId>org.apache.maven.plugins</groupId>
                                        <artifactId>maven-war-plugin</artifactId>
                                        <configuration>
                                            <webXml>WebContent\WEB-INF\web.xml</webXml>
                                        </configuration>
                                    </plugin>
                                </plugins>
                            </build>
                        </project>
                        

                        【讨论】:

                        • 上述方法在启用构面并且 WebContent 是 web.xml 所在的文件夹时有效。
                        猜你喜欢
                        • 1970-01-01
                        • 2014-10-29
                        • 2013-08-13
                        • 2018-05-09
                        • 1970-01-01
                        • 2016-01-28
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多