循环依赖性阻止战争在Tomcat上部署

时间:2019-04-19 17:30:02

标签: java tomcat annotations jersey circular-dependency

我有一次使用Jersey进行的休息服务大战(将称为A),它在本地以及在多个测试Tomcat服务器上进行部署,但是无法在3个产品服务器中的1个上加载。我相信这是处理批注时的循环依赖关系。服务器上的另一场战争B随处可见。在服务器A发生故障的情况下,如果B被删除,A将起作用。这是通过随机试验和错误发现的。服务器设置完全相同,只是看起来战争文件以不同顺序出现。我一直在研究强制以特定顺序处理jar文件中的注释的方法,以消除任何伪随机性。我正要发布有关的问题。我什至没有意识到这是否是订购罐子的正确方法,我深切于多切线。所以我想我首先可能会对我的前进方向有所了解。

18-Apr-2019 07:43:42.886 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/tomcat/webapps/[A].war]
18-Apr-2019 07:43:43.337 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/[A].war]]
                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.IllegalStateException: Unable to complete the scan for annotations for web application [/[A]] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [oracle.net.aso.d->oracle.net.aso.e->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->
.
.
.
java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object]
                at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2100)
                at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2044)
                at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1990)
                at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1960)
                at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1913)
                at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1153)
                at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:765)
                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:5154)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                ... 10 more

1 个答案:

答案 0 :(得分:1)

oracle.net.aso.d->oracle.net.aso.e->java.lang.Object->java.lang.Object->java.lang.Object
  1. 查看该消息,它扫描单个jar中的类,并进入java.lang.Object上的循环。这很奇怪。 (如果可以使用最新版本的Tomcat复制该文件,例如,仅包含该jar文件的空Web应用程序,请提出问题)。

  2. 从注释扫描中跳过文件相当容易。在Apache Tomcat的“常见问题”页面上的“如何使Tomcat启动更快”下对此进行了记录。

请注意,您没有提到您使用的是哪个版本的Apache Tomcat(x.y.z)。

相关问题