Generic Top

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE

1. Introduction

In this tutorial, we'll discuss the common Eclipse error, “web.xml is missing and <failOnMissingWebXml> is set to true“, that we get while creating a web application.

2. Eclipse Error

In Java web applications, web.xml is the standard name of the deployment descriptor.

We can create a web application using Maven or a dynamic web project using Eclipse. Eclipse doesn't create the default deployment descriptor web.xml under the WEB-INF/ directory.

Java EE 6+ specifications have attempted to de-emphasize deployment descriptors, as they can be replaced by annotations. However, the lower versions still require it.

The failOnMissingWebXml property is one of the properties of the Apache Maven war plugin, org.apache.maven.plugins:maven-war-plugin. The default value of this plugin is true for version < 3.1.0 and false for the later versions.

This means that if we're using maven-war-plugin earlier than version 3.1.0, and the web.xml file is not present, then the goal to package it as a war file will fail.

3. Using web.xml

For all the cases where we still need the web.xml deployment descriptor, we can easily generate web.xml in Eclipse:

  • Right click on the web project
  • Hover to Java EE Tools on the menu
  • Select Generate Deployment Descriptor Stub from the sub-menu

 

Voila! the web.xml file is generated under the WEB-INF/ directory.

4. Without web.xml

In most cases, we may not require the web.xml file at all. Instead of keeping a blank web.xml file in our project, we can simply skip creating it altogether. Luckily, there are two simple approaches, depending on which version of the maven-war-plugin we're using.

4.1. Using maven-war-plugin Before 3.1.0

We can configure all the plugins of a Maven project in the <plugins> section of our pom.xml. As we've said previously, the default value for failOnMissingWebXml is true before version 3.1.0 of the plugin.

Let's declare the maven-war-plugin in our pom.xml and explicitly set the property failOnMissingWebXml to false:

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

4.2. Using maven-war-plugin 3.1.0 and Later

We can also avoid setting the property explicitly by upgrading the version of maven-war-plugin. The default value of the property failOnMissingWebXml is false for maven-war-plugin version 3.1.0 and later:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.1.0</version>
</plugin>

5. Conclusion

In this article, we saw the reason behind the missing web.xml error and multiple approaches to fix it.

As usual, our example can be found over on GitHub.

Generic bottom

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE
Comments are closed on this article!