26
votes

Plus d'un fragment portant le nom [spring_web] a été trouvé. Ce n'est pas légal avec une commande relative

J'ai une application de démarrage à ressort qui fonctionne bien lorsque je l'exécute à l'aide du serveur intégré d'Intellj. Cependant, lorsque je le conditionne dans un fichier .war et le déploie sur tomcat, j'obtiens l'erreur suivante:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from salaryPaymentRequestRepo -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <akka.version>2.5.17</akka.version>
    </properties>
    <repositories>
        <repository>
            <id>default</id>
            <url>http://repo.maven.apache.org/maven2</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.univocity</groupId>
            <artifactId>univocity-parsers</artifactId>
            <version>2.7.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>26.0-jre</version>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.23.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.11.0</version>
        </dependency>
        <dependency>
            <groupId>ma.glasnost.orika</groupId>
            <artifactId>orika-core</artifactId>
            <version>1.4.2</version><!-- or latest version -->
            <exclusions>
                <exclusion>
                    <artifactId>javassist</artifactId>
                    <groupId>org.javassist</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-actor_2.12</artifactId>
            <version>${akka.version}</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-stream_2.12</artifactId>
            <version>${akka.version}</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-persistence_2.12</artifactId>
            <version>${akka.version}</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-testkit_2.12</artifactId>
            <version>${akka.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.2</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/resources/lib/ojdbc7-12.1.0.jar</systemPath>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Mon projet ne contient pas plusieurs fragments Web, donc je ne sais pas ce qui pourrait causer ce problème.

pom.xml

    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/file-upload-0.0.1-SNAPSHOT]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
    at 

     org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)
    at 
   org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at  
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: More than one fragment with the name [spring_web] was found. This is not legal with relative ordering. See section 8.2.2 2c of the Servlet specification for details. Consider using absolute ordering.
    at org.apache.tomcat.util.descriptor.web.WebXml.orderWebFragments(WebXml.java:2200)
    at 
  org.apache.tomcat.util.descriptor.web.WebXml.orderWebFragments(WebXml.java:2159)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1124)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:769)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at 

 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5176)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 10 more

21-Jan-2019 01:51:04.709 SEVERE [localhost-startStop-1] 
     org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [C:\Users\dennismo\Dev\Projects\Production Prep\file-upload-module\webapps\file-upload-0.0.1-SNAPSHOT.war]
 java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/file-upload-0.0.1-SNAPSHOT]]
    at 

 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:758)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)
    at 


      org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)  


2 commentaires

Il semble que ce soit un changement introduit dans tomcat 7.0.93 FWIW ...


Si vous utilisez la configuration JAVA, trouvez votre réponse sur stackoverflow.com/questions/57626140/… .


17 Réponses :


12
votes

On dirait que vous avez deux versions différentes de Spring, vérifiez vos dépendances pour voir si vous avez une dépendance à une autre version de Spring.

mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId


4 commentaires

à quoi sert la dépendance mvn: tree -Dverbose -Dincludes = groupId: artifactId. Où dois-je utiliser cela?


Exécutez-le dans votre terminal à la racine du projet Maven pour localiser les dépendances en conflit. Documentation officielle Maven


Pour gradle, vous pouvez utiliser l'option dependencyInsight, plus disponible dans la documentation .


Comment utiliser l'option dependencyInsight dans Gradle, où dois-je la trouver? Ce lien ne fonctionne pas



7
votes

Ce problème a été résolu en ajoutant un ordre absolu des descripteurs de déploiement.

La balise <absolute-ordering/> été ajoutée au fichier web.xml

Référence:

https://www.oracle.com/technetwork/articles/javaee/javaee6overview-part2-136353.html


3 commentaires

Vraiment ajouté à pom.xml au lieu de web.xml ?


@Pardha Saradhi J'ai la même erreur, mais je ne peux pas utiliser votre solution bcos, c'est sur mon application Spring Boot où je n'ai pas besoin d'utiliser un web.xml.Ensuite, que vais-je faire pour résoudre ce problème.


@ KJEjava48 Je n'ai aucune idée de comment nous pouvons y parvenir au printemps. Je l'ai fait avec l'aide du processus suivi du lien ci-joint. Si vous trouvez une solution, postez-la. Ce sera utile aux autres.



0
votes

J'ai eu le même problème et je l'ai résolu. Vous avez des erreurs similaires mais pas de démarrage à ressort utilisé. J'ai utilisé spring 3.x avec java 8. Si les solutions ci-dessus ne fonctionnent pas, changez les jars et recherchez si ces jars sont compatibles avec la version java que vous utilisez ou non. spring 3.x n'est pas compatible avec java 8.


0 commentaires

64
votes

ajoutez la <absolute-ordering /> à votre web.xml juste sous la <display-name> . devrait marcher.


4 commentaires

Excellent! C'était un élément essentiel de la solution dont nous avions besoin et nous n'aurions pas pu le faire sans vous. J'ai publié notre solution complète sur stackoverflow.com/questions/57332888


J'utilise la configuration basée sur Java et je n'ai pas de fichiers xml, alors que dois-je faire ??


Pour tous ceux qui veulent plus d'informations, j'ai eu la même exception qui disait aussi "Voir la section 8.2.2 2c de la spécification Servlet pour plus de détails. Pensez à utiliser un ordre absolu." ... voici cette section: c. Exception de nom en double: si, lors de la traversée des fragments Web, plusieurs membres avec le même élément <name> sont rencontrés, l'application doit consigner un message d'erreur informatif contenant des informations pour aider à résoudre le problème et ne doit pas se déployer. Par exemple, une façon de résoudre ce problème consiste pour l'utilisateur à utiliser l'ordre absolu, auquel cas l'ordre relatif est ignoré.


@Roman Sterlin J'ai la même erreur, mais je ne peux pas utiliser votre solution bcos, c'est sur mon application Spring Boot où je n'ai pas besoin d'utiliser un web.xml.Ensuite, que vais-je faire pour résoudre ce problème.



8
votes

Cette erreur semble se produire après la mise à jour du framework de printemps du projet, la suppression du fichier d'historique du projet dans les webapps Tomcat peut résoudre le problème.


1 commentaires

Ouais, cela a fonctionné pour moi aussi. Esp. en développement, le répertoire WEB-INF / lib de l'application web déployée n'est pas vidé uniquement à cause d'un redéploiement - vous devez le nettoyer. Donc, si vous mettez à niveau Spring, vous pouvez obtenir temporairement plusieurs versions dans le répertoire de la bibliothèque.



4
votes

J'utilise la version Spring 5.1.8 et Apache Tomcat 8.5. Dans mon fichier web.xml , j'ai ajouté l'ajout <absolute-ordering /> juste après la <display-name> et cela a fonctionné pour moi.


0 commentaires

6
votes

ajouter une balise de classement absolute-ordering à votre web.xml juste sous la balise de display-name d' display-name devrait fonctionner. - Cette réponse de Roman Sterlin a fonctionné pour moi aussi.


2 commentaires

L'ajout de <commande absolue /> dans le fichier web.xml juste avant </web-app> a fonctionné pour moi. <servlet-mapping> <servlet-name> Votre nom de servlet </servlet-name> <url-pattern> / votre nom d'application / api / v1 / * </url-pattern> </servlet-mapping> <absolu-ordering > </absolute-ordering> </web-app>


J'utilise la configuration basée sur Java et je n'ai pas de fichiers xml, alors que dois-je faire ??



8
votes

Le nettoyage du serveur a fonctionné pour moi. Faites ce qui suit:

Faites un clic droit sur le serveur -> Nettoyer.

Redéployez ensuite l'application sur le serveur.


1 commentaires

Cela a fonctionné pour moi sur eclipse IDE, +1, merci.



2
votes

Mon projet est basé sur la version Springboot (1.5.21.RELEASE) et génère une guerre et un déploiement en tomcat physique. J'avais eu le même problème et j'étais résolu avec l'approche ci-dessous.

Solution: excluez la dépendance tomcat-embed-websocket de spring-boot-starter-web dans le fichier pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring.boot.version}</version>
            <exclusions>
                **<exclusion>
                    <groupId>org.apache.tomcat.embed</groupId>
                    <artifactId>tomcat-embed-websocket</artifactId>
                </exclusion>**
            </exclusions>
        </dependency>


0 commentaires

2
votes

Cette erreur vient généralement de cela si nous avons deux copies de spring dans notre conteneur, qui sont chargées par différents chargeurs de classe (dans mon cas, le chargeur de classe partagé et le chargeur de classe webapp).

Vérifiez le pom efficace, si vous avez des bocaux / classes de printemps incorporés dans un bundle, si c'est le cas, supprimez-le, vous devez utiliser celui installé en tant que bundle du conteneur.


0 commentaires

0
votes

J'ai résolu un problème similaire en supprimant toutes mes applications (j'avais là deux applications différentes) du dossier webapps, puis en redéployant mon fichier war.


0 commentaires

3
votes

J'ai eu le même problème lors de la construction d'un fichier de guerre avec maven car je n'avais pas nettoyé avant l'empaquetage et maven incluait plusieurs versions de fichiers jar de printemps des versions précédentes.


0 commentaires

0
votes

Juste une réponse des débutants aux débutants:

Assurez-vous de placer web.xml dans / WebContent / WEB-INF.

Je l'ai placé par inadvertance dans / WebContent (pas / WEB-INF), et je suis presque devenu fou en essayant d'appliquer sans succès certaines des solutions proposées, le message d'erreur était exactement le même.


1 commentaires

Il devrait "finir" dans your_tomcat/webapps/your_webapp_name/WEB-INF/web.xml FWIW



0
votes

Pour moi, cela signifiait que j'incluais des "pots ombragés" qui regroupaient des copies de printemps en eux. Donc, tous les mêmes "version à ressort" mais plusieurs copies de ressort provoquent cela.

Vous pouvez vérifier si tel est le cas en accédant à tomcat/webapps/your_webapp/WEB-INF/lib , en libérant tous les jars et en recherchant "spring_web"

ex:

# first unjar everything then

WEB-INF/lib $ grep spring_web . -r

spring-web-4.3.12.RELEASE/META-INF/web-fragment.xml
7:  <name>spring_web</name>

some_other_shaded_jar/META-INF/web-fragment.xml
7:  <name>spring_web</name>

Si tel est le cas, vous devez utiliser le correctif absolu des autres réponses ou ne pas inclure plusieurs copies du printemps.

Il semble que ce soit un changement introduit dans tomcat 7.0.93 FWIW (il n'a donc pas provoqué cet échec dans les anciennes versions de tomcat 7)


0 commentaires

1
votes

J'ai dû ajouter ceci dans web.xml pour que cela fonctionne:

<absolute-ordering>
    <name>fragment_name_if_required</name>
    <others></others>
</absolute-ordering>


0 commentaires

2
votes

Cela s'est produit après avoir mis à jour la version Spring Framework dans un projet Maven. J'ai finalement pu résoudre le problème en exécutant mvn clean , apparemment les anciens JAR Spring étaient récupérés quelque part sous la cible.


0 commentaires

0
votes

Toutes ces réponses sont excellentes, mais vérifiez également si la lib "Apache CXF" est dans votre chemin de classe, elle est apparemment en conflit avec Spring Web 5.2.3, pour moi, j'ai temporairement supprimé parce que je ne l'utilise pas et maintenant mon projet fonctionne correctement.


0 commentaires