Błąd „wymagany atrybut webxml” w Maven

318

Otrzymuję następujący błąd:

Błąd montażu WAR: wymagany jest atrybut webxml (lub istniejący WEB-INF / web.xml, jeśli jest wykonywany w trybie aktualizacji)

Mam web.xmlwłaściwe miejsceprojectname\src\main\webapp\WEB-INF\web.xml

Co może być tego przyczyną?

użytkownik617966
źródło
1
czy twoje opakowanie jest gotowe na wojnę?
crowne
Napotkałem ten sam problem i aktualizacja wersji wtyczki rozwiązała go.
TechnocratSid,

Odpowiedzi:

359

Przydałby się fragment kodu wtyczki maven-war. Wygląda na web.xmlto, że jest we właściwym miejscu, ale możesz spróbować wyraźnie podać lokalizację

<plugin>            
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <configuration>
    <webXml>src\main\webapp\WEB-INF\web.xml</webXml>        
  </configuration>
</plugin>
Arpit
źródło
36
Pracowałem też dla mnie, dzięki. Ale jaka jest domyślna lokalizacja, w której Maven szuka?
Buffalo,
5
Właśnie zaktualizowałem wtyczkę Maven War z 2.1.1 do 2.4 i muszę wyraźnie określić domyślną lokalizację.
xverges
2
Możesz zaktualizować swoją odpowiedź dla użytkowników ItelliJ IDEA - IntelliJ tworzy kolejną strukturę projektu, więc będzie to <webXml> web \ WEB-INF \ web.xml </webXml>
Vic Torious
próbowałem odpowiedzi, ale nadal otrzymywałem ten sam błąd, zamiast tego zrobiłem to „C: \ Users \ xxxx \ Videos \ maven-projects \ my-project \ src \ webapp \ WEB-INF” i działało dobrze. Nie wiem na czym polega problem. To moje szczęście. Dziękuję
Bunny Joel
1
Działa świetnie! Dzięki :)
yanike
145
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

To rozwiązanie działa dla mnie (wcześniej używałem 2.2). Używam również konfiguracji opartej na Javie dla Servlet 3.0 i nie muszę mieć pliku web.xml.

srv
źródło
Wersje 3.x tej wtyczki mają teraz domyślnie failOnMissingWebXml na false. Tak <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.3</version> </plugin> powinno wystarczyć.
Eisenknurr
pracował dla mnie tak, jak byłem i nadal używam jboss-web.xml - dzięki!
JGlass,
Mam projekt, który nie zawiera pliku web.xml, i to zadziałało dla mnie. Kompilacja Maven powiodła się.
blueSky
81

Dla mnie też działa idealnie.

<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>
Burhan ARAS
źródło
4
Powyższe działa, gdy aspekty są włączone, a WebContent jest folderem, do którego wchodzi plik web.xml.
Ram
32

Jest tak, ponieważ nie uwzględniłeś pliku web.xml w swoim projekcie internetowym i próbujesz zbudować wojnę za pomocą maven. Aby rozwiązać ten błąd, musisz ustawić failOnMissingWebXml na false w pliku pom.xml.

Na przykład:

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

Więcej szczegółów można znaleźć na blogu: https://ankurjain26.blogspot.in/2017/05/error-assembling-war-webxml-attribute.html

Ankur jain
źródło
23

Jeśli przeprowadzasz migrację z konfiguracji opartej na języku XML do konfiguracji opartej na Javie i usunąłeś potrzebę pliku web.xml poprzez wdrożenie WebApplicationInitializer, po prostu usuń wymaganie obecności pliku web.xml.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        ... 
    </configuration>
Beatty
źródło
podobnej odpowiedzi udzielono wcześniej
Paul Verest
Ten daje kontekst, w którym dokładnie musi iść linia.
foo
20

Wartość mojego tagu webXml musiała wyglądać następująco:

<webXml>${project.basedir}\src\main\webapp\WEB-INF\web.xml</webXml> 
BoneGoat
źródło
dokładnie! Nie mogłem tego rozgryźć, dopóki nie zobaczyłem, że na początku miałem tylko cięcie <warSourceDirectory>\src\main\webapp</warSourceDirectory>, nie działa! Nie w wersji 2.6
Adam
19

Miałem dokładnie ten sam problem i rozwiązałem go w następujący sposób:

Utwórz nowy folder o nazwie WEB-INFpod src/main/webbappwtedy

Kliknij prawym przyciskiem myszy swój projekt -> Java EE Tools -> Generuj deskryptor wdrażania Stub

To powinno wygenerować twoje web.xml

Mam nadzieję, że pomoże to rozwiązać Twój problem: D

Catalin Ciolocoiu
źródło
13

Wygląda na to, że plik web.xml znajduje się we właściwej lokalizacji, ale mimo to ten błąd jest często spowodowany przez niezgodność struktury katalogów z oczekiwaniami Mavena. Na przykład, jeśli zaczynasz od aplikacji internetowej Eclipse, którą próbujesz zbudować za pomocą Maven.

Jeśli to jest problem, szybkie poprawki jest stworzenie
src/main/javaoraz
src/main/webappkatalog (i innych katalogów, jeśli ich potrzebują) i po prostu przenieść pliki.

Oto przegląd układu katalogu maven: http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

MattC
źródło
6

Jeśli zmienisz domyślną ścieżkę projektu, musisz określić lokalizację pliku web.xml, na przykład:

        <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>
johnander11
źródło
6

Zgodnie z dokumentacją mówi: czy kompilacja zakończy się niepowodzeniem, jeśli brakuje pliku web.xml. Ustaw na fałsz, jeśli chcesz, aby WAR został zbudowany bez pliku web.xml. Może to być przydatne, jeśli budujesz nakładkę bez pliku web.xml. Wartość domyślna to: prawda. Właściwość użytkownika to: failOnMissingWebXml.

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

Mam nadzieję, że to wyjaśnia

codechefvaibhavkashyap
źródło
5

Dla mnie też zadziałało.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webXml>WebContent\WEB-INF\web.xml</webXml>
            </configuration>
        </plugin>
Vineet kaushik
źródło
To działa, ale dzienniki mówi teraz: WEB-INF\web.xml already added, skipping. To dziwne, kiedy tego nie dodam, mam błąd.
erwineberhard
Taki sam jak erwineberhard. WEB-INF\web.xml already added, skipping
Prachi
4

mvn-war-plugin 2.3 naprawia to:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
        </plugin>
        ...
Gabor
źródło
4

Miałem ten sam błąd na serwerze testowym, ale nie w lokalnym. Po kilku minutach odkryłem, że IDE nie zostało zsynchronizowane z pom.xml. Oto jak to rozwiązać:

Ponownie wygeneruj deskryptor wdrażania za pomocą Eclipse

  1. Kliknij prawym przyciskiem myszy folder projektu
  2. W menu kontekstowym wybierz „Java EE Tools”, a następnie „Generuj deskryptor instalacji Stub” Wygeneruj plik web.xml
  3. Spowoduje to utworzenie pliku web.xml. web.xml w strukturze projektu

Ponownie wygeneruj deskryptor wdrażania za pomocą IntelliJ

  1. Kliknij prawym przyciskiem myszy folder projektu
  2. W menu kontekstowym wybierz „Otwórz ustawienia modułu”, a następnie kliknij +, aby dodać deskryptor wdrażania sieci. Wygeneruj deskryptor wdrażania
  3. Następnie możesz zmienić ścieżkę do deskryptora lub katalogów Web Ressource i po prawej stronie.
  4. Wtedy otrzymasz coś takiego: Struktura projektu
KeyMaker00
źródło
1
a w netbeans: klikniesz prawym przyciskiem myszy węzeł projektu> Nowy> Inne> Internet> Standardowy deskryptor wdrażania (web.xml).
wytarty
2

Upewnij się, że plik pom.xml jest poprawnie umieszczony w folderze projektu. i nie w folderze docelowym ani w żadnym innym miejscu.

Wygląda na to, że pom.xml nie jest względnie wyrównany.

Meghashyam
źródło
2

Czy struktura folderów została zmieniona, aby plik nie był już w /src/main/webapp/WEB-INF/web.xml ?

Aby rozwiązać ten problem, nadałem mojemu folderowi internetowemu nazwę webapp i umieściłem go w src / main. Wygląda na to, że Maven domyślnie szuka pliku web.xml pod adresem /src/main/webapp/WEB-INF/web.xml . Jeśli to zrobisz, nie musisz wyraźnie informować maven, gdzie jest plik web.xml. A jeśli zmieniłeś strukturę folderów i kompilacja niedawno przestała działać, może to być powód.

Uwaga: jest to stary post, ale opublikowane rozwiązania nie wskazują, dlaczego działająca kompilacja nagle przestaje działać.

Usman Mutawakil
źródło
2

Istnieje wiele odpowiedzi i większość z nich zadziała, ale dodam jeszcze jeden punkt, który, moim zdaniem, ma nie mniej ważne znaczenie.
Zgodnie z komunikatem dziennika korzystasz maven. Maven to narzędzie do zarządzania projektami oparte na niektórych konwencjach. Buduje projekt, tworzy odpowiednią strukturę katalogów i umieszcza pliki w odpowiednich katalogach, co jest zgodne z Sun Microsystems Directory Structure Standardaplikacjami Java EE / Web.

Możesz uwzględnić wiele rzeczy, w tym wtyczki maven, zmianę / rekonfigurację katalogu głównego projektu itp., Ale jest tylko jeden prosty krok, który możesz zrobić i twój projekt powinien być w porządku. Wystarczy umieścić web.xmlponiżej src\main\webapp\WEB-INF\i spróbować zbudować projekt mvn package.

Mam nadzieję, że doda to nieco więcej światła temu problemowi.

Giorgi Tsiklauri
źródło
1

Ten błąd występuje, ponieważ każesz Mavenowi spakować pliki na wojnę .

<packaging>war</packaging>

Czy naprawdę potrzebujesz wojny? Jeśli nie, włóż tam słoik. Oto pełny kod:

<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>
Julia Ashomok
źródło
jar i wojna to zupełnie inne historie. Myślę, że potrzebna jest tutaj wojna, ponieważ archiwum jest wdrażane w kontenerze internetowym i nie jest uruchamiane osobno jako samodzielna aplikacja jar.
Giorgi Tsiklauri
1

🔴 failOnMissingWebXml od 2020 roku

Wszystkie pozostałe odpowiedzi mogą być nieaktualne, ponieważ zmieniła się domyślna wartość używana przez wtyczkę maven-war-plugin :

Począwszy od wersji 3.1.0, ta właściwość ma domyślną wartość false, jeśli projekt zależy od interfejsu API Servlet 3.0 lub nowszego.

Więc tylko rzeczą, którą musisz zrobić, to dodać

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

Przykład:

<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>
Ponury
źródło