由于内存限制,我正在尝试构建一个内存占用较少的grails应用程序。我用这个论点“--nojars”来构建战争。我创建了一个没有所有jar的war文件,当我在glassfish中部署时遇到了这个错误
加载应用程序时出现异常:java.lang.Exception:java.lang.IllegalStateException:ContainerBase.addChild:start:org.apache.catalina.LifecycleException:java.lang.IllegalArgumentException:java.lang.ClassNotFoundException:org.codehaus .groovy.grails.web.util.Log4jConfigListener
似乎应用程序无法找到jar文件的位置。
在glassfish中部署应用程序之前,我已经指明了库的路径。
我错过了什么吗?
答案 0 :(得分:0)
通常建议使用GlassFish的Common Classloader。这意味着将共享JARS放入 $ domain-dir / lib 文件夹(但不到该子文件夹中)。
您可能正在尝试将 Application Classloader 与asadmin deploy --libraries
命令一起使用。这更复杂且容易出错。如果您不需要具有不同Web应用程序的相同JAR的不同版本,那么您一定要选择上面指定的 Common Classloader 。
另请参阅The Classloader Hierarchy以获取参考。
编辑根据提问者的评论更新:
domain/domain1/lib
文件夹肯定有效(我已经测试过了)。要验证这一点,请将log4j.jar
放入该文件夹,然后将test.jsp
添加到domain1/applications/$applicationName
,其中只包含:
<% out.println(
org.apache.log4j.Logger.getLogger(this.getClass())); %>
如果这样做但你的其他代码没有,那么可能还有另外一点需要考虑:你在代码中使用Log4J的Logger.getLogger(..)
或Apache Commons'LogFactory.getInstance(..)
吗?
有关相关问题,请参阅文章Taxonomy of class loader problems encountered when using Jakarta Commons Logging。 - 我还建议您发布完整的堆栈跟踪。