发现了多个名称为[spring_web]的片段。这在相对排序中是不合法的。

60

我有一个Spring Boot应用程序,当我使用Intellij嵌入式服务器运行它时,它可以正常工作。然而,当我将它打包成.war文件并部署到Tomcat上时,我会收到以下错误:

    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)  

我的项目中不包含多个web-fragment,因此我不知道什么可能会导致这个问题。

pom.xml

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

似乎这是在Tomcat 7.0.93中引入的更改。顺便说一下... - rogerdpack
如果您使用JAVA配置,请在https://stackoverflow.com/questions/57626140/spring-boot-java-lang-illegalargumentexception-more-than-one-fragment-with-th/64952792#64952792找到您的答案。 - Umer Khalid
26个回答

99

<display-name>标签之后的web.xml文件中添加<absolute-ordering />标签即可。应该可以正常工作。


太棒了!这是我们所需解决方案的关键部分,没有你我们无法完成。我在https://stackoverflow.com/questions/57332888发布了我们的完整解决方案。 - DavesPlanet
我正在使用基于Java的配置,没有任何XML文件,那么我该怎么办呢? - KJEjava48
如果有人想要更多信息,我遇到了相同的异常,也显示“请参阅Servlet规范8.2.2 2c节以获取详细信息。考虑使用绝对排序。”...这是该部分内容:c.重复名称异常:如果在遍历Web片段时遇到具有相同<name>元素的多个成员,则应用程序必须记录包括帮助解决问题的信息的信息性错误消息,并且必须无法部署。例如,解决此问题的一种方法是用户使用绝对排序,在这种情况下,将忽略相对排序。 - Michael Stalcup
@Roman Sterlin,我也遇到了同样的错误,但是我不能使用你的解决方案,因为它是在我的Spring Boot应用程序中,我不需要使用web.xml。那么我该怎么办才能解决这个问题呢? - KJEjava48

40
清理服务器对我非常有效。只需按照以下步骤操作:

右键单击服务器->清理。

然后在服务器上重新部署应用程序。


3
我没有找到要点击的图标,但是mvn clean install也解决了我的问题。 - Anderson
./gradlew clean 对我来说起作用了 - Buda Sergiu Flavius

25
听起来你可能有两个不同版本的Spring,请检查你的依赖关系,看看是否依赖于另一个Spring版本。

听起来你可能有两个不同版本的Spring,请检查你的依赖关系,看看是否依赖于另一个Spring版本。

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

mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId 的用途是什么?我应该在哪里使用它? - KJEjava48
在Maven项目根目录下,在终端中运行它以定位冲突的依赖项。 官方Maven文档 - David Simonsbacka
2
在IntelliJ中遇到了这个bug(升级后,它没有删除pom.xml中指定的先前的Spring版本)。 - John Donn
根据 @JohnDonn 的评论,
  1. 从 .m2 中删除了 spring 的 artifacts。
  2. 从 InteliJ 中使缓存无效并清除了缓存。 对我有用!
- jayaneetha
如果您在主应用程序中引用了一个带有Spring依赖项的阴影jar,并且还引用了相同的Spring依赖项,则也会发生这种情况。嗯,阴影Spring依赖项是一个糟糕的想法,我想。[自己做个笔记][也可以看看下面的一些答案] - hello_earth
显示剩余2条评论

16

我在使用Maven构建war文件时遇到了相同的问题,因为我在打包之前没有清理过,并且Maven包含了先前构建中多个版本的Spring jar文件。


12

在项目升级spring框架后,出现了这个错误。清除tomcat webapps 中的项目历史记录文件,可能会解决这个问题。


没错,这对我也起作用了。特别是在开发中,部署的 Web 应用程序的 WEB-INF/lib 目录不会因为重新部署而清空 - 您需要清理它。因此,如果您升级 Spring,则可以在 lib 目录中暂时获得多个版本。 - Robert Watkins
我遇到了在将Spring 2.3.1更新到任何更高版本时出现的错误。同时,清理webapp文件夹对我来说也没有起作用。 - Michael Hegner

9

4
真的是将内容添加到了 pom.xml 而不是 web.xml 中吗? - Selaron
@Pardha Saradhi,我也遇到了同样的错误,但是我不能使用你的解决方案,因为它是在我的Spring Boot应用程序中,我不需要使用web.xml。那么我该怎么办才能解决这个问题呢? - KJEjava48
@KJEjava48 我不知道我们如何在Spring上实现它。我是通过附加链接中的过程来完成的。如果你找到任何解决方案,请发布出来。这将对其他人有所帮助。 - Pardha Saradhi

8
我在Maven项目中更新Spring Framework版本后出现了这个问题。最终我通过运行mvn clean解决了这个问题,显然是因为旧的Spring JAR文件被某处的target文件夹引用。

4
如果您手动添加了所有的Jars,那么您需要删除WEB-INF/lib/spring-web-5.2.9.RELEASE-sources.jar或类似的Jar文件(也许您的Jar版本不同)。一旦您删除了该Jar文件,Tomcat将开始正常工作。

4

这个错误通常是因为我们的容器中有两个Spring副本,它们被不同的类加载器加载(在我的情况下是共享类加载器和Web应用程序类加载器)。

检查有效的pom文件,如果有任何包含Spring jar / class的bundle,请将其删除,您应该使用安装在容器中的bundle。


如果你在WAR包的WEB-INF/lib目录下和Tomcat共享库目录下都有同一个库的两个副本,那么正确的解决方案是删除其中一个。 - user11153

2

作为一名新手的回答:

请确保将web.xml文件放置在/WebContent/WEB-INF目录下。

我曾经不小心将它放在了/WebContent目录下(而不是/WEB-INF),然后试图尝试一些提出的解决方案,但都没有成功,错误信息完全相同,几乎让我发疯。


1
应该 "最终落脚" 在 your_tomcat/webapps/your_webapp_name/WEB-INF/web.xml 中。顺便提一下。 - rogerdpack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接