在 Eclipse 中验证 pom.xml 时出现 FailOnMissingWebXml 错误

FailOnMissingWebXml error when validating pom.xml in Eclipse

编译 Maven 项目时,我在 pom.xml 的验证阶段遇到此错误。这是一个相当大的项目,具有复杂的构建过程。该项目只包含 Java 脚本代码,不必编译成 war。我正在寻找一种方法:

完整错误:

Description Resource    Path    Location    Type web.xml is missing 
and <failOnMissingWebXml> is set to true    pom.xml /testproject    line 6    
Maven Java EE Configuration Problem

点击报错后问题好像出在pom.xml:

这一行
  <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>com.scs</groupId>
  <artifactId>scs-control-panel</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging> **THE ERROR POINTS TO THIS LINE**

  <parent>
    <groupId>com.scs</groupId>
    <artifactId>scs</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../scs</relativePath>
  </parent>

  <build>
  </build>

  <dependencies>
  </dependencies>

</project>

不确定这是 Eclipse 错误还是 Maven 错误,但可能是 Eclipse,因为 Maven 通过命令行顺利运行。它也可能是 Eclipse 中的一个错误,我是 运行 Eclipse Java EE IDE for Web Developers Version: Mars.1 Release (4.5.1).

更新 1:我尝试在 Eclipse 中更新项目,但没有任何区别。

更新 2:我尝试将包裹类型从 war 更改为 pom 但没有区别。

  1. 做:

    mvn clean eclipse:clean
    
  2. 将此添加到您的 POM:

    <packaging>war</packaging>
    <properties>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
    

Maven 中的一切都围绕插件展开。插件是在构建过程中执行某些行为的程序。一些插件包含是隐含的,我们无需声明任何内容。

这些隐含的插件具有默认配置。例如,maven-compiler-plugin 包含在所有项目中而无需声明它。要覆盖默认配置,我们需要在 pom.xml 文件中声明插件并设置配置。例如,您会看到许多项目覆盖 maven-compiler-plugin 上的默认版本,其中 sourcetarget 设置为 Java 1.5。我们可以改成1.8

<build>
  <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.1</version>
          <configuration>
              <source>1.8</source>
              <target>1.8</target>
          </configuration>
      </plugin>
  </plugins>
</build>

这只是插件背后的一些理论,可以让您了解正在发生的事情。

话虽如此,为了使用 <packaging>war<packaging>,我们无需声明任何内容即可使用 maven-war-plugin。就像使用 <packaging>jar</packaging> 时一样,隐含了 maven-jar-plugin

maven-war-plugin 的默认配置在没有 web.xml 的地方失败(配置 属性 为 failOnMissingWebXml)。所以如果我们想覆盖这个默认值,我们需要声明插件,然后将 属性 的值设置为 false(不失败)

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

更新

war 插件现在允许您只使用它要查找的 属性。这允许您简单地声明 属性 而不必覆盖插件。要添加此 属性,您只需将值为 false 的 属性 failOnMissingWebXml 添加到项目 <properties>

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

只需添加这个,如果您没有进一步的配置需要添加到编译器插件,您将不再需要在 pom 中重写和声明编译器插件。


更新 2

因此,如果您声明 maven-war-plugin 并使用 <version> 3.0.0+,则没有 web.xml 失败的默认值将设置为 false,因此我们不再需要覆盖配置 属性,尽管我们仍然需要声明插件。

将下面的属性添加到POM.xml

 <failOnMissingWebXml>false</failOnMissingWebXml>

我想最简单的方法是选择 war 插件版本 3。failOnMissingWebXml 的 default 值已从 truefalse.

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

一旦在您的 pom 中设置,讨厌的错误就会永远消失。

我可以通过在 POM.xml 中添加这个 属性 来解决这个问题,如下所示。

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