Why is maven-war-plugin failing for web.xml missin

2020-03-13 03:39发布

问题:

Here's a challenge: why is this build failing?

I have configured Maven's maven-war-plugin not to fail on an abscent web.xml file, it seems:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
            <execution>
                <id>prepare-war</id>
                <phase>prepare-package</phase>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <archiveClasses>false</archiveClasses>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix />
                        </manifest>
                        <manifestEntries>
                            <Implementation-Build>${build.number}</Implementation-Build>
                            <Implementation-Title>${project.name}</Implementation-Title>
                            <Built-By>${user.name}</Built-By>
                            <Built-OS>${os.name}</Built-OS>
                            <Build-Date>${build.date}</Build-Date>
                        </manifestEntries>
                    </archive>
                    <webResources>
                        <resource>
                            <!-- this is relative to the pom.xml directory -->
                            <directory>./target/dist</directory>
                        </resource>
                    </webResources>
                </configuration>
            </execution>
        </executions>
    </plugin>

But despite of this configuration it keeps failing like this:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.4:war (default-war) on project com.specktro.orchid.operations.portal.frontend: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]

I actually don't have the web.xml, so I need it to assemble the war without it.

I tried adding a bogus <webXml>none</webXml> into the config, but that didn't change anything...

What am I missing?

回答1:

The execution ID in the POM is prepare-war. Maven runs its own default execution of the war plugin for projects with packing type war. The default execution has ID default-war. As the POM is currently configured, the war goal is running twice.

If you look at the error message:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.4:war (default-war) on project com.specktro.orchid.operations.portal.frontend: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]

You may see the execution ID that fails in parenthesis (default-war). If you change the execution ID to default-war your problem will go away, AND you will no longer have two executions of the war goal running.



回答2:

This should work:

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
            <executions>
                <execution>
                    <id>prepare-war</id>
                    <phase>prepare-package</phase>
                    <configuration>
                        <archiveClasses>false</archiveClasses>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix />
                            </manifest>
                            <manifestEntries>
                                <Implementation-Build>${build.number}</Implementation-Build>
                                <Implementation-Title>${project.name}</Implementation-Title>
                                <Built-By>${user.name}</Built-By>
                                <Built-OS>${os.name}</Built-OS>
                                <Build-Date>${build.date}</Build-Date>
                            </manifestEntries>
                        </archive>
                        <webResources>
                            <resource>
                                <!-- this is relative to the pom.xml directory -->
                                <directory>./target/dist</directory>
                            </resource>
                        </webResources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Please notice that the <failOnMissingWebXml>false</failOnMissingWebXml> section has been moved up to the plugin configuration rather than the execution.



回答3:

The problem is related to the version that you are currently working with. You need to see your local repository and see the version that you have already downloaded. Go to your .m2 folder and look for

.m2\repository\org\apache\maven\plugins\maven-compiler-plugin

In that folder you can see the versions that are available for you.

Change the version for the version that you have in your folder and it works!