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ą?


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>

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.


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>

4
Powyższe działa, gdy aspekty są włączone, a WebContent jest folderem, do którego wchodzi plik web.xml.
Ram


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>

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> 

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


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


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>

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


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>

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>
        ...

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

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.


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ć.


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.


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>

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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.