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

44 人关注

我有一个spring boot应用程序,当我使用Intellj的嵌入式服务器运行它时,工作正常。但是,当我把它打包成.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)
     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)
   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)
 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)
  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)
 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]]
 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)
      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>
2 个评论
似乎这是在tomcat 7.0.93中引入的一个变化,仅供参考。
如果你使用JAVA配置,请在 stackoverflow.com/questions/57626140/.... 找到你的答案。
java
spring-boot
spring-mvc
tomcat8
user2054833
user2054833
发布于 2019-01-21
20 个回答
0 人赞同

在你的 web.xml 中添加 <absolute-ordering /> >标签,就在 <display-name> 标签下面。 应该有效。

非常好!这是我们需要的解决方案的关键部分,没有你,我们不可能做到。我在 stackoverflow.com/questions/57332888 上发布了我们的完整解决方案。
我正在使用基于java的配置,我没有任何xml文件,那么我应该怎么做呢?
对于任何想了解更多信息的人来说,我也遇到了同样的异常,它还说:"详情见Servlet规范的8.2.2 2c节。考虑使用绝对排序。"......这里是那一节:c. 重复名称异常:如果在遍历网络碎片时,遇到具有相同<name>元素的多个成员,应用程序必须记录一个信息性错误信息,包括帮助解决问题的信息,并且必须无法部署。例如,解决这个问题的一个方法是用户使用绝对排序,在这种情况下,相对排序被忽略。
@Roman Sterlin 我也有同样的错误,但我不能使用你的解决方案,因为这是在我的spring boot应用程序上,我不需要使用web.xml.那么我应该如何解决这个问题呢?
Lehar Bhandari
Lehar Bhandari
发布于 2021-08-14
0 人赞同

清洁服务器对我来说很有效。只需做以下工作:

在服务器上点击右键 -> 清洁。

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

David Simonsbacka
David Simonsbacka
发布于 2021-08-14
已采纳
0 人赞同

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

mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId
mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId的用途是什么。我应该在哪里使用这个?
在Maven项目根部的终端上运行它,以定位冲突的依赖关系。 官方Maven文档
对于gradle,你可以使用dependencyInsight选项,在 文档 中可以找到更多。
如何在gradle中使用dependencyInsight选项,我应该在哪里找到它?该链接不工作
在IntelliJ中出现了这个错误(升级后没有删除pom.xml中显示的先前Spring版本)。
0 人赞同

这个错误似乎发生在项目的Spring框架更新之后,清除Tomcat webapps 中的项目历史文件可能会解决这个问题。

是的,这对我来说也很有效。特别是在开发中,部署的Web应用的WEB-INF/lib目录不会因为重新部署而被清空,你需要清理它。因此,如果你升级Spring,你可以在lib目录中暂时得到多个版本。
我在更新Spring 2.3.1到任何上级版本时都会出现这种错误。此外,清理webapp文件夹对我来说也没有什么作用。
Pardha Saradhi
Pardha Saradhi
发布于 2021-08-14
0 人赞同

这个问题通过增加部署描述符的绝对排序得到了解决。

标签 <absolute-ordering/> 被添加到web.xml中。

参考资料。

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

真的添加到 pom.xml 而不是 web.xml 中?
@Pardha Saradhi 我也有同样的错误,但我不能使用你的解决方案,因为这是在我的spring boot应用程序上,我不需要使用web.xml.那么我要怎么做才能解决这个问题。
@KJEjava48 我不知道我们如何能在spring上实现它。我已经在所附链接的帮助下完成了这个过程。如果你找到任何解决方案,请发表出来。这将对其他人有帮助。
Joe Hunt
Joe Hunt
发布于 2021-08-14
0 人赞同

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

Andrew Steffey
Andrew Steffey
发布于 2021-08-14
0 人赞同

我在一个Maven项目中更新了Spring框架的版本后出现了这种情况。我最终通过运行 mvn clean 解决了这个问题,显然,旧的Spring JARs在目标下的某个地方被拾起。

Anuj Panwar
Anuj Panwar
发布于 2021-08-14
0 人赞同

这个错误通常来自于,如果我们的容器中有两个spring的副本,它们被不同的类加载器加载(在我的例子中,共享类加载器和webapp类加载器)。

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

user11153
对我的情况来说是正确的答案。如果你有两份相同的库--一份在WAR的 WEB-INF/lib 中,另一份在Tomcat的共享库目录中,就会发生这种情况。
Raghu Reddy
Raghu Reddy
发布于 2021-08-14
0 人赞同

我的项目是基于Springboot的版本(1.5.21.RELEASE),生成war并部署在物理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>
rogerdpack
rogerdpack
发布于 2021-08-14
0 人赞同

对我来说,这意味着我包括了一些 "阴影罐",这些罐子中捆绑了弹簧的副本。 因此,所有相同的 "spring版本 "但有多个spring副本的情况都会导致这种情况。

你可以通过进入 tomcat/webapps/your_webapp/WEB-INF/lib ,解开所有jar,并搜索 "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>

如果是这种情况,你就需要使用其他答案的绝对修复方法,或者不包括多份弹簧的某种方式。

似乎这是在tomcat 7.0.93中引入的变化(所以在旧版本的tomcat 7中没有出现这种故障)。

这种方法帮助我轻松地识别
Koushik ruidas
Koushik ruidas
发布于 2021-08-14
0 人赞同

如果你手动添加了所有的jar,那么你必须删除 WEB-INF/lib/spring-web-5.2.9.RELEASE-sources.jar 或类似的jar文件(可能你的jar版本会有所不同)。一旦你删除了这个jar,Tomcat就会开始工作。

rohan
rohan
发布于 2021-08-14
0 人赞同

我遇到了同样的问题,并解决了它。得到了类似的错误,但没有使用spring boot。我使用spring 3.x和java 8。如果上述解决方案不奏效,请更换罐子并搜索这些罐子是否与你所使用的java版本兼容。

Kacper Cichecki
Kacper Cichecki
发布于 2021-08-14
0 人赞同

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

Carlos
Carlos
发布于 2021-08-14
0 人赞同

只是一个从新手到新手的答案。

确保你把web.xml放在/WebContent/WEB-INF里面。

我无意中把它放在了/WebContent(而不是/WEB-INF)中,试图应用一些建议的解决方案,但没有成功,错误信息完全一样,我差点疯了。

它应该在 your_tomcat/webapps/your_webapp_name/WEB-INF/web.xml 中 "结束"。
Mauricio Zárate
Mauricio Zárate
发布于 2021-08-14
0 人赞同

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

user3189713
user3189713
发布于 2021-08-14
0 人赞同

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

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

在设置了正确的路径后,它工作得很好。

Rajan Sonvane
Rajan Sonvane
发布于 2021-08-14
0 人赞同

对我来说,这是因为在构建路径中存在两个spring-web jars,即spring-web-5.02-release.jar和spring-web-sources-5.02-release.jar。通过移除spring-web-sources-5.02-release.jar,问题得到了解决。

谢谢,终于有东西为我工作了!!。
Bass
Bass
发布于 2021-08-14
0 人赞同

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

Smart Coder
Smart Coder
发布于 2021-08-14
0 人赞同

我不得不在web.xml中添加这个来使其工作。

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