找到多个名为 [spring_web] 的片段。这对于相对排序是不合法的

Posted

技术标签:

【中文标题】找到多个名为 [spring_web] 的片段。这对于相对排序是不合法的【英文标题】:More than one fragment with the name [spring_web] was found. This is not legal with relative ordering 【发布时间】:2019-06-14 20:39:09 【问题描述】:

当我使用 Intellj 的嵌入式服务器运行它时,我有一个运行良好的 Spring Boot 应用程序。但是,当我将其打包成 .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)  

我的项目不包含多个网络片段,所以我不知道是什么导致了这个问题。

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 FWIW 中引入的更改... 如果您使用JAVA配置,请在***.com/questions/57626140/…找到答案。 【参考方案1】:

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

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

【讨论】:

mvn 依赖有什么用:tree -Dverbose -Dincludes=groupId:artifactId 。我应该在哪里使用这个?? 在您的终端中的 Maven 项目根目录中运行它以查找冲突的依赖项。 Official Maven documentation 对于 gradle,您可以使用 dependencyInsight 选项,更多信息请参见 documentation。 如何在 gradle 中使用 dependencyInsight 选项,我应该在哪里找到它?该链接无效【参考方案2】:

通过添加部署描述符的绝对顺序解决了这个问题。

标签&lt;absolute-ordering/&gt;已添加到web.xml

参考:

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

【讨论】:

真的添加到pom.xml而不是web.xml @Pardha Saradhi 我有同样的错误,但我不能使用你的解决方案,因为它在我不需要使用 web.xml 的 Spring Boot 应用程序上。那我该怎么办解决这个问题。 @KJEjava48 我不知道我们如何在春天实现它。我是在附加链接中的过程的帮助下完成的。如果您找到任何解决方案,请发布它。这对其他人会有所帮助。【参考方案3】:

我遇到了同样的问题并解决了。有类似的错误,但没有使用弹簧靴。我已经将 spring 3.x 与 java 8 一起使用。如果上述解决方案不起作用,请更改 jar 并搜索这些 jar 是否与您正在使用的 java 版本兼容。 spring 3.x 与 java 8 不兼容。

【讨论】:

【参考方案4】:

&lt;absolute-ordering /&gt; 标记添加到web.xml&lt;display-name&gt; 标记下方。 应该可以。

【讨论】:

太棒了!这是我们需要的解决方案的关键部分,没有您我们无法做到。我在***.com/questions/57332888 发布了我们的完整解决方案 我正在使用基于java的配置,我没有任何xml文件,那我该怎么办?? 对于任何想要更多信息的人,我有同样的例外,它还说“有关详细信息,请参阅 Servlet 规范的第 8.2.2 2c 节。考虑使用绝对排序。”...这是该部分: C。重复名称异常:如果在遍历 web-fragments 时遇到具有相同 元素的多个成员,应用程序必须记录一条信息性错误消息,其中包括帮助解决问题的信息,并且必须无法部署。例如,解决此问题的一种方法是让用户使用绝对排序,在这种情况下忽略相对排序。 @Roman Sterlin 我有同样的错误,但我不能使用你的解决方案,因为它在我不需要使用 web.xml 的 Spring Boot 应用程序中。那我该怎么办解决这个问题。【参考方案5】:

这个错误似乎是在项目的spring框架更新后出现的,清除tomcatwebapps中的项目历史文件可能会解决问题。

【讨论】:

是的,这也对我有用。特别是。在开发中,部署的 webapp 的 WEB-INF/lib 目录不会因为重新部署而被清空——你需要清理它。所以如果你升级Spring,你可以在lib dir中临时得到多个版本。 我收到将 Spring 2.3.1 更新到任何更高版本的错误。清理 webapp 文件夹对我来说也没有成功。【参考方案6】:

清理服务器对我有用。只需执行以下操作:

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

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

【讨论】:

【参考方案7】:

我的项目是基于 Springboot 的版本(1.5.21.RELEASE)并生成战争并部署在物理 tomcat 中。 我遇到了同样的问题,并通过以下方法解决了。

解决方法:在 pom.xml 中的 spring-boot-starter-web 中排除 tomcat-embed-websocket 依赖

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

【讨论】:

【参考方案8】:

这个错误通常是因为我们的容器中有两个 spring 副本,它们由不同的类加载器加载(在我的例子中是共享类加载器和 webapp 类加载器)。

检查有效的 pom,如果你有任何捆绑包嵌入 spring jars/类,如果有,请删除它,你应该使用从容器中作为捆绑包安装的那个。

【讨论】:

我的案例的正确答案。如果您有两个相同库的副本,则会发生这种情况 - 一个在 WAR 内的 WEB-INF/lib 中,另一个在 Tomcat 共享库目录中。【参考方案9】:

我通过从 webapps 文件夹中删除我所有的应用程序(我有两个不同的应用程序)然后重新部署我的 war 文件来解决了类似的问题。

【讨论】:

【参考方案10】:

我在使用 maven 构建 war 文件时遇到了同样的问题,因为我在打包之前没有清理,并且 maven 包含了以前构建的多个版本的 spring jar 文件。

【讨论】:

【参考方案11】:

只是新手对新手的回答:

确保将 web.xml 放在 /WebContent/WEB-INF 中。

我无意中将它放在 /WebContent(而不是 /WEB-INF)中,并且几乎发疯了,试图应用一些建议的解决方案但未成功,错误消息完全相同。

【讨论】:

它应该在your_tomcat/webapps/your_webapp_name/WEB-INF/web.xml FWIW 中“结束”【参考方案12】:

对我来说,这意味着我包含了一些“阴影罐子”,它们在其中捆绑了 spring 的副本。所以所有相同的“spring 版本”但 spring 的多个副本都会导致这种情况。

您可以通过转到tomcat/webapps/your_webapp/WEB-INF/lib,解开所有罐子,然后搜索“spring_web”来检查是否是这种情况

例如:

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

如果是这种情况,您需要使用其他答案的绝对修复或不以某种方式包含多个 spring 副本。

似乎这是在 tomcat 7.0.93 FWIW 中引入的更改(因此它不会在旧版本的 tomcat 7 中引发此故障)

【讨论】:

这个方法帮助我轻松识别【参考方案13】:

我必须在 web.xml 中添加它才能使其工作:

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

【讨论】:

【参考方案14】:

我在 Maven 项目中更新 Spring Framework 版本后发生了这种情况。我终于能够通过运行mvn clean 来解决这个问题,显然旧的 Spring JAR 正在目标下的某个地方被拾取。

【讨论】:

【参考方案15】:

所有这些答案都很好,但还要检查“Apache CXF”库是否在你的类路径中,它显然与 Spring Web 5.2.3 冲突,对我来说我暂时删除了,因为我实际上没有使用它,现在我的项目是运行正常。

【讨论】:

【参考方案16】:

如果您手动添加所有的 jar,那么您必须删除 WEB-INF/lib/spring-web-5.2.9.RELEASE-sources.jar 或类似的 jar 文件(可能是您的 jar版本会有所不同)。删除该 jar 后,tomcat 将开始工作。

【讨论】:

【参考方案17】:

对我来说,这个问题发生在 Tomcat 没有正确安装时。我已经重新安装并更新了安装路径:

eclipse window->preferences->runtime ENV -> path of the newly installed tomcat 

设置正确路径后,效果很好。

【讨论】:

【参考方案18】:

见行:

原因:java.lang.IllegalArgumentException:找到多个名为 [spring_web] 的片段。这对于相对排序是不合法的。有关详细信息,请参阅 Servlet 规范的第 8.2.2 2c 节。考虑使用绝对排序。

表示使用绝对排序。 因此,您必须在 web.xml 文件中的 &lt;web-app&gt; 标签中添加 &lt;absolute-ordering/&gt; 标签。

【讨论】:

【参考方案19】:

对我来说,这是因为构建路径中有 2 个 spring-web jar,即 spring-web-5.02-release.jar 和 spring-web-sources-5.02-release.jar。通过删除 spring-web-sources-5.02-release.jar,问题得到解决。

【讨论】:

谢谢,终于有东西对我有用了!!【参考方案20】:

遇到了同样的问题,想找到根本原因。我知道 spring-web jar 的片段被称为“spring_web”。但是,我的源代码在其他任何地方都没有“spring_web”片段。因此,我使用了一个工具(jfind)通过我在构建时生成的 EAR 的扩展形式来搜索“spring_web”。令人惊讶的是,在构建时生成的另一个项目的 web-fragment jar 中发现了“spring_web”。在解决第二次事件后,问题就消失了。所以这似乎是由于重复的“spring_web”片段,我们只需要一个。

【讨论】:

以上是关于找到多个名为 [spring_web] 的片段。这对于相对排序是不合法的的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xcode 将快照划分为多个片段,以便让用户与每个片段进行交互?

MVC & WebAPI“找到多个类型匹配名为...的控制器”

Solr Highlighting:如何为同一字段请求多个片段长度?

找到多个与名为“Home”的控制器匹配的类型

盖茨比没有找到graphql片段

一个片段的活动有啥意义吗?