ApplicationStateManager.fireStarting期间Liberty启动期间的StackOverflowError

时间:2017-07-12 17:37:08

标签: war websphere-liberty

BLUF:我得到一个stackoverflow,在它到达我的任何代码之前,用一个war文件启动我的Liberty服务器。我无法调试导致问题的原因。我尝试将trace语句添加到server.xml但是从来没有得到我可以解释的文件(二进制文件)并且尝试打开日志文件没有可用选项(灰色)。如果有人有任何想法如何确定导致堆栈溢出的原因我会很感激帮助。提前致谢。我的代码确实使用了@Inject,但我不认为这是问题,因为如果我将代码从一个单独的项目/ jar转移到war项目中,一切正常。

在使用共享库启动单个war到单个目录中的jar文件时运行wlp 17.0.0.1,在到达任何代码之前得到StackOverflowError(基于RestServicesApplication和任何静态初始化器中的设置断点)。 / p>

只有当某些类被移动到一个单独的项目并因此被移动到一个单独的jar中时才会出现此问题(例如,将它们移回war项目允许所有类运行正常)。

我检查过所有类和方法引用都是公开的。我在新的jar文件中调用公共静态方法。

我不知道如何找出问题,因为堆栈跟踪中的ffdc文件中没有对我的代码的引用。

我已经验证了jar文件中所需的类,并且没有引用重复的类。

基本上,war文件中的类有一个调用:

public static JSONObject processFuzzyMatch(ID session,
   ID userID, JSONObject request)
   throws ILDException {
   try {
      return NLUFuzzyEntityMatcherFunction.processFuzzyMatch(request);
   } catch (Exception e) {
      throw new ILDException(e);
   }
}

和NLUFuzzyEntityMatcherFunction在声明为:

的jar文件中
public static JSONObject processFuzzyMatch(JSONObject request)
  throws Exception 

以下是最后一行重复报告问题的示例(对于堆栈溢出...)

Stack Dump = com.ibm.ws.container.service.state.StateChangeException: java.lang.StackOverflowError
    at com.ibm.ws.container.service.state.internal.ApplicationStateManager.fireStarting(ApplicationStateManager.java:33)
    at com.ibm.ws.container.service.state.internal.StateChangeServiceImpl.fireApplicationStarting(StateChangeServiceImpl.java:51)
    at com.ibm.ws.app.manager.module.internal.DeployedAppInfoBase.preDeployApp(DeployedAppInfoBase.java:376)
    at com.ibm.ws.app.manager.module.internal.DeployedAppInfoBase.deployApp(DeployedAppInfoBase.java:403)
    at com.ibm.ws.app.manager.war.internal.WARApplicationHandlerImpl.install(WARApplicationHandlerImpl.java:66)
    at com.ibm.ws.app.manager.internal.statemachine.StartAction.execute(StartAction.java:141)
    at com.ibm.ws.app.manager.internal.statemachine.ApplicationStateMachineImpl.enterState(ApplicationStateMachineImpl.java:1253)
    at com.ibm.ws.app.manager.internal.statemachine.ApplicationStateMachineImpl.run(ApplicationStateMachineImpl.java:866)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.StackOverflowError
    at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
    at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
    at java.io.File.exists(File.java:819)
    at com.ibm.wsspi.kernel.service.utils.FileUtils$3.run(FileUtils.java:88)
    at com.ibm.wsspi.kernel.service.utils.FileUtils$3.run(FileUtils.java:85)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.ibm.wsspi.kernel.service.utils.FileUtils.fileExists(FileUtils.java:85)
    at com.ibm.ws.artifact.loose.internal.LooseArchive$DirEntryInfo.matches(LooseArchive.java:232)
    at com.ibm.ws.artifact.loose.internal.LooseArchive$DirEntryInfo.matches(LooseArchive.java:207)
    at com.ibm.ws.artifact.loose.internal.LooseArchive.getEntry(LooseArchive.java:782)
    at com.ibm.ws.artifact.overlay.internal.DirectoryBasedOverlayContainerImpl.getEntry(DirectoryBasedOverlayContainerImpl.java:838)
    at com.ibm.ws.adaptable.module.internal.AdaptableContainerImpl.getEntry(AdaptableContainerImpl.java:113)
    at com.ibm.ws.jsp.taglib.TagLibraryCache.loadWebInfMap(TagLibraryCache.java:613)
    at com.ibm.ws.jsp.taglib.TagLibraryCache.loadWebInfMap(TagLibraryCache.java:629)
    at com.ibm.ws.jsp.taglib.TagLibraryCache.loadWebInfMap(TagLibraryCache.java:629)
    (above line repeats due to stack overflow)

2 个答案:

答案 0 :(得分:1)

这是Liberty上的一个已知问题。 Liberty 17.0.0.3上将提供对该问题的修复。

您可以使用一些解决方法:

  • 我假设你在jar中有一个名为WEB-INF的文件夹。将文件夹名称更改为其他名称。该文件夹名称导致JSP引擎转到Web模块的WEB-INF(再次扫描所有内容!),而不是jar的WEB-INF。
  • 尝试将JSP配置参数disableTldSearch设置为true;如果您使用自定义标记库,这可能会很麻烦。使用属性集,需要在web.xml中声明所有自定义TLD文件。
  • 禁用CDI;我知道你可能不可能,因为你提到你正在使用注射剂。

答案 1 :(得分:0)

不知怎的,我搞砸了jar项目的项目设置(可能是因为我从Web项目中复制了pom.xml,忘了把它改成jar ......)。这可能导致/ apps文件夹中的xml文件被搞乱,并且嵌入了对不存在的war文件的引用(见下文):

<?xml version="1.0" encoding="UTF-8"?>
<archive>
    <archive targetInArchive="/WEB-INF/lib/ildMicroServices-1.0.0-SNAPSHOT.jar">
        <dir sourceOnDisk="/csnext/ild/ild_framework/ildMicroServices/WebContent" targetInArchive="/"/>
        <dir sourceOnDisk="/csnext/ild/ild_framework/ildMicroServices/target/classes" targetInArchive="/WEB-INF/classes"/>
        <dir sourceOnDisk="/csnext/ild/ild_framework/ildMicroServices/target/test-
classes" targetInArchive="/WEB-INF/classes"/>
    </archive>
    <dir sourceOnDisk="/csnext/ild/ild_framework/ildRESTServices/target/m2e-wtp/web-resources" targetInArchive="/"/>
    <dir sourceOnDisk="/csnext/ild/ild_framework/ildRESTServices/WebContent" targetInArchive="/"/>
    <dir sourceOnDisk="/csnext/ild/ild_framework/ildRESTServices/target/classes" targetInArchive="/WEB-INF/classes"/>
    <dir sourceOnDisk="/csnext/ild/ild_framework/ildRESTServices/target/test-classes" targetInArchive="/WEB-INF/classes"/>
</archive>

通过删除此嵌入式存档,问题就消失了。

我从Neon升级到Oxygen,17.0.0.1升级到17.0.0.2之后才发现这个,当使用旧服务器的工件设置新服务器时,我注意到/ apps中的xml文件没有&#39 ;看起来不错。

我希望这有助于某人。

相关问题