5

We recently moved my app to a multi-module maven architecture and it now throws a stackoverflow error upon deployment in Tomcat.

Stack trace is included below:

GRAVE: Error waiting for multi-thread deployment of WAR files to complete
java.util.concurrent.ExecutionException: java.lang.StackOverflowError
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
    at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:757)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:477)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1393)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:318)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401)
    at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:346)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1140)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.StackOverflowError
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
    at java.lang.StringBuffer.append(StringBuffer.java:224)
    at org.apache.log4j.helpers.OptionConverter.getSystemProperty(OptionConverter.java:105)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:417)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)
    at org.apache.log4j.helpers.OptionConverter.substVars(OptionConverter.java:429)

Can anyone please let me know how to sort this issue?

balteo
  • 23,602
  • 63
  • 219
  • 412

1 Answers1

3

You're using a System property in the config and the value of the property is ${name}, i.e. -Dname=${name}

When Log4j tries to expand the value of ${name}, it gets ${name} -> loop.

If it's hard to tell which variable causes the problem, set a breakpoint in OptionConverter.java:105 or enable debugging with -Dlog4j.debug=true

Aaron Digulla
  • 321,842
  • 108
  • 597
  • 820
  • Hello Aaron! Thanks for the reply. I am trying to set log4j.debug property but I am not sure where to do that in Tomcat: which specific *.bat file (under windows)? – balteo Oct 15 '12 at 09:47
  • Put `set JAVA_OPTS=-Dlog4j.debug=true` into `setenv.bat` – Aaron Digulla Oct 15 '12 at 09:54
  • I have no such file as `setenv.bat` under the /bin directory of my Tomcat-7.0.32 installation... – balteo Oct 15 '12 at 10:04
  • See http://stackoverflow.com/questions/286007/how-to-tune-tomcat-5-5-jvm-memory-settings-without-using-the-configuration-progr Tomcat will read the file if it exists in the same folder as `catalina.bat` – Aaron Digulla Oct 15 '12 at 10:16
  • I see. I have created the setenv.bat file with the appropriate line and yet I don't get any output from log4j... Instead, I am going to try and set a breakpoint as you advised and will post the result here accordingly. – balteo Oct 15 '12 at 10:49
  • Look into `catalina.out`; log4j writes the debug info to `stdout` – Aaron Digulla Oct 15 '12 at 11:30
  • Interesting. There should be one. Compare `catalina.bat` with a pristine version from the Tomcat ZIP archive. – Aaron Digulla Oct 15 '12 at 12:16
  • I've just set up a pristine version of tomcat with the setenv.bat file and I still see no such file as catalina.out in the /log directory. – balteo Oct 15 '12 at 12:34
  • I see. The logging documentation says "When running Tomcat on unixes, the console output is usually redirected to the file named catalina.out." I expected the same on Windows but apparently, I'm wrong. – Aaron Digulla Oct 15 '12 at 12:53
  • Thanks anyway Aaron. I wasn't eventually able to pinpoint the root of the problem because we made some modifications and the stackoverflow error went away. – balteo Oct 15 '12 at 14:12