0

当我从 WEB-INF/lib 中删除 JSF jars(jsf-api-2.0.1.jar 和 jsp-impl-2.0.1.jar)时,我在我的 Windows 机器上准备了一个新鲜干净的 Tomcat7,我点击了这个错误:

Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    ... 10 more

当我将 2 个罐子放在 WEB-INF/lib 中时,我遇到了错误:

java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1148)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1643)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

关于在 Tomcat 7 中运行 JSF 的任何线索?

4

1 回答 1

2

您没有指出错误是在部署时立即发生还是在一段时间后发生。如果它在一段时间后发生,即在您的应用程序运行期间,您的代码将受到指责。查看这篇出色的文章,它将帮助您使用 JDK 6 追踪错误的根源。

错误表明与您的应用程序容器有关的类加载问题。PermGen永久代(简称 PermGen)是 JVM 存储对象(例如类和字符串文字)的区域。通常,垃圾收集器不应该在这里频繁操作。一旦不再使用 Web 应用程序的类加载器(每个部署的 Web 应用程序有一个),应用服务器加载的类应自动清理。Tomcat 过去曾在这方面给我带来过问题(尤其是在 Netbeans 中使用时)。在反复重新部署后,它似乎无法有效地自行清理。除了增加 permgen 空间的大小之外,您还可以做一些事情

1) 您可以将在该 tomcat 实例中运行的 Web 应用程序的通用 jar 移动到TOMCAT_HOME/lib. 这样,您可以期望您的类库不会像 tomcat 的默认行为那样在每个需要的 Web 应用程序中多次加载(请参阅this)。但是请谨慎使用此选项;如果您最终部署了一个包含较新版本 jar 的 Web 应用程序,您可能会遇到NoClassDefFound错误。

2)你可以试试这个-XX:MaxPermGen,而不是(或除了)-XX:MaxPermSizemkyong 在他的文章中建议的那个。

还要看看这个问题,它是进一步步骤的答案

于 2012-11-07T05:53:03.380 回答