Reputation: 4585
I am getting the following error:
Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
I have got web.xml
in right place which is projectname\src\main\webapp\WEB-INF\web.xml
What could be causing this?
Upvotes: 354
Views: 377903
Reputation: 1960
I have a new answer for this question. It's not really about how to solve the problem (though I will cover some options for that briefly) as it is about how/when/why the error might occur on various versions of Maven and its plugins.
Some context: I'm a new employee at an old company. Running latest Maven (3.9.6 at the time), several of our projects wouldn't build for me (failing with the error given in the question), but they built fine for my teammates.
Digging in, here's what I found:
There was no web.xml file anywhere in our source code, nor in the generated WAR file.
The POMs all specify <packaging>war</packaging>
The POMs didn't specify a version of maven-war-plugin.
If a POM doesn't specify a plugin version in this scenario, Maven uses "default bindings" to decide what version of the plugin to use. These bindings are baked into the version of Maven being used to perform the build:
artifact-handlers.xml
to default-bindings.xml
)On the 4.0 branches, this configuration has moved into Java code and can now be found here; it still references version 3.4.0.
I will leave digging through the history farther back than 3.0 as an exercise for the reader.
Note: Maven also has a "super POM", also baked into the Maven version, which for other situations is also sometimes used to choose the version of something that is otherwise unspecified. It's not relevant in the context of the version of the maven-war-plugin or other packaging plugins (ear, jar, etc), but it is relevant in many other scenarios.
So, the build worked for anyone using Maven 3.0 through 3.8.8, which was everybody on the team but me.
Potential solutions, many of which are covered in other great answers here:
failOnMissingWebXml=false
mvnw
approach to embed a version of Maven into our projects.But again, this answer isn't about solutions, but rather about causes.
The error message itself comes from the plexus-archiver library. Version 2.1 of said library (which was used by maven-war-plugin 2.2) had a bug in which it exhibited behavior that was the reverse of what's intended, but the Maven developers noticed this and negated that bug by reversing their own logic. This was fixed in plexus-archiver 2.7 by deprecating the setIgnoreWebXml
setter in favor of setExpectWebXml
, which more correctly described the existing behavior. This aspect of plexus-archiver remains unchanged to this day. maven-war-plugin upgraded to plexus-archiver 2.9 and the updated setter as of version 2.6. None of this appears to have affected whether the error would have occurred, and in fact if I configure my build to use maven-war-plugin 2.6, it succeeds without encountering this error. Likewise with maven-war-plugin 3.0.0.
With maven-war-plugin 3.1.0, I begin to see the error. In this version, the default setting for failOnMissingWebXml
was changed from false
to null
, which is implicitly treated as true
unless Servlet 3.0 classes are found on the classpath. My project does not target Servlet 3.0, so the behavior is expected.
There are no relevant changes beyond 3.1.0, so the same behavior exists with the latest 3.4.0.
In case any Maven developers read this, I would just like to remind them (and everyone developing tools and/or APIs for public consumption) to beware of breaking changes! While I understand that not everyone follows semver religiously, and there are often practical reasons for such decisions, I think you'll share my disappointment that maven-war-plugin 3.1 and (and by extension Maven 3.9.0) introduced a breaking change without either project bumping the major version or mentioning it in their release notes. Thankfully, this one has several easy fixes.
Upvotes: 0
Reputation: 1976
All other answers about might be obsolete because the default value used by the maven-war-plugin changed 2017:
Starting with 3.1.0, this property defaults to false if the project depends on the Servlet 3.0 API or newer.
So the ONLY thing you have to do is to add
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</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>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Upvotes: 14
Reputation: 51
For this error I added the following dependency then the issue is solved.
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
Upvotes: 0
Reputation: 2923
If you don't want to use web.xml you exclude it in pom.xml.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
The right version you see in the error message:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war
(default-war) on project spring4-mvc-maven-ajax-example:
Here it is 2.2.
Found this solution on mycong.com
https://mkyong.com/maven/maven-webxml-attribute-is-required/
Upvotes: 0
Reputation: 99
If you change the default project path, you must specify the location of the web.xml file, for example:
<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>
Upvotes: 6
Reputation: 11
There are two things to note regarding packaging.
war
file will require you define the web.xml
file in the appropriate folder as described by Catalin Ciolocoiu.jar
would not need that structure and should work straight away.Upvotes: 0
Reputation: 584
I encountered this message while trying to package a Spring Boot project as a WAR file and deploying that WAR file in a standalone Tomcat instance.
I used Spring Intializr to generate the initial pom.xml and related artifacts. The problem was that in that pom.xml (Spring version 2.6.+), this dependency was in place.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
I had to replace it with this one:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
And also added this dependency with scope of "provided"
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
Also, of course, changed the packaging
<packaging>war</packaging>
Upvotes: 1
Reputation: 11120
This is an old question, and there are many answers, most of which will be more or less helpful; however, there is one, very important and still relevant point, which none of the answers touch (providing, instead, different hacks to make build possible), and which, I think, in no way has a less importance.. on the contrary.
According to your log message, you are using Maven, which is a Project Management tool, firmly following the conventions, over configuration principle.
When Maven builds the project:
Maven's Standard Directory Layout
;Sun Microsystems Directory Structure Standard
for Java EE [web] applications.You may incorporate many things, including maven plugins, changing/reconfiguring project root directory, etc., but better and easier is to follow the default conventions over configuration, according to which, (now is the answer to your problem) there is one simple step that can make your project work: Just place your web.xml
under src\main\webapp\WEB-INF\
and try to build the project with mvn package
.
Upvotes: 8
Reputation: 1015
As per the documentation, it says : Whether or not to fail the build if the web.xml file is missing. Set to false if you want you WAR built without a web.xml file. This may be useful if you are building an overlay that has no web.xml file. Default value is: true. User property is: failOnMissingWebXml.
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<extensions>false</extensions>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
Hope it makes more clear
Upvotes: 10
Reputation: 361
It worked for me too.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>WebContent\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
Upvotes: 10
Reputation: 2119
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
This solution works for me (I was using 2.2 before). Also, I am using Java Based Configuration for Servlet 3.0 and no need to have web.xml file.
Upvotes: 195
Reputation: 8598
This error occurs because you tell to Maven to pakage files to war.
<packaging>war</packaging>
Do you really need war? If not, put jar there. Here is full code:
<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>
Upvotes: 2
Reputation: 542
I had the exact same problem and i solved it like this :
Make a new folder named WEB-INF
under src/main/webbapp
then
Right Click on your Project -> Java EE Tools -> Generate Deployment Descriptor Stub
This should generate your web.xml
I hope this helps by solving your problem :D
Upvotes: 20
Reputation: 993
This is because you have not included web.xml in your web project and trying to build war using maven. To resolve this error, you need to set the failOnMissingWebXml to false in pom.xml file.
For example:
<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
Please see the blog for more details: https://ankurjain26.blogspot.in/2017/05/error-assembling-war-webxml-attribute.html
Upvotes: 45
Reputation: 6462
I have had the same error on the test server but not in local. After a few minutes, I discovered that the IDE wasn't synchronized with the pom.xml. Here is how I solve it:
Upvotes: 5
Reputation: 5259
Was your folder structure altered so the file is no-longer at /src/main/webapp/WEB-INF/web.xml ?
To resolve this issue, I gave my web folder the name webapp and placed it inside the src/main. Maven seems to look for web.xml by default at /src/main/webapp/WEB-INF/web.xml. If you do this then you don't need to explicitly tell maven where web.xml is. And if you've altered your folder structure and your build recently stopped working, this could be why.
Note: This is an old post but the posted solutions don't point out why a working build would suddenly stop working.
Upvotes: 2
Reputation: 6260
It would be helpful if you can provide a code snippet of your maven-war-plugin.
Looks like the web.xml
is at right place, still you can try and give the location explicitly
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webXml>src\main\webapp\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
Upvotes: 383
Reputation: 456
If you are migrating from XML-based to Java-based configuration and you have removed the need for web.xml by implementing WebApplicationInitializer, simply remove the requirement for the web.xml file to be present.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
...
</configuration>
Upvotes: 23
Reputation: 450
mvn-war-plugin 2.3 fixes this:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
</plugin>
...
Upvotes: 5
Reputation: 21
Make sure pom.xml is placed properly in Project folder. and not inside target folder or any where else.
Looks like pom.xml is not relatively aligned.
Upvotes: 2
Reputation: 6334
It does look like you have web.xml in the right location, but even so, this error is often caused by the directory structure not matching what Maven expects to see. For example, if you start out with an Eclipse webapp that you are trying to build with Maven.
If that is the issue, a quick fix is to create a
src/main/java
and a
src/main/webapp
directory (and other directories if you need them) and just move your files.
Here is an overview of the maven directory layout: http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
Upvotes: 13
Reputation: 584
The value of my webXml tag needed to look like this in order to work:
<webXml>${project.basedir}\src\main\webapp\WEB-INF\web.xml</webXml>
Upvotes: 22
Reputation: 2517
It works perfectly for me too.
<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>
Upvotes: 87