【问题标题】:java.lang.NoClassDefFoundError: javax/faces/context/FacesContextFactoryjava.lang.NoClassDefFoundError: javax/faces/context/FacesContextFactory
【发布时间】:2014-10-13 21:07:47
【问题描述】:

所有类似的问题都对我没有帮助,所以我正在创建自己的问题:

我正在 Eclipse 中使用 Maven 创建一个 JSF Webapp。为了测试它,我将它作为带有 war:war 目标的 Maven 构建运行,这可以正常工作。但是,当我将 war-file 部署到本地 tomcat 进行测试时,我在启动过程中收到以下错误消息:

SCHWERWIEGEND: Critical error during deployment:
java.lang.NoClassDefFoundError: javax/faces/context/FacesContextFactory
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:270)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:270)
        at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:618)
        at javax.faces.FactoryFinder.getImplementationInstance(FactoryFinder.java:509)
        at javax.faces.FactoryFinder.access$400(FactoryFinder.java:139)
        at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:993)
        at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:343)
        at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:303)
        at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:219)
        at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:360)

        at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:225)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)

        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:976)

        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1653)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: javax.faces.context.FacesContextFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 39 more

我有以下依赖...

<dependencies>
  <dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.1.7</version>
  </dependency>
  <dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.1.7</version>
  </dependency>
</dependencies>

和插件:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.1</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>
    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
    </plugin>
</plugins>

如果您需要更多信息,请告诉我。谢谢!

【问题讨论】:

  • 你检查过这个链接stackoverflow.com/questions/7886035/…
  • @Adi 是的,我按照建议添加了监听器,但它为我解决了问题。
  • 解决了吗?如果没有,请检查 tomcat 库中是否还有其他 jsf jar。尝试删除它们,这样它们就不会在类加载中发生冲突
  • @Adi:嗯?你读过堆栈跟踪吗?有问题的听众已经在那里了!
  • @Adi 没有解决,抱歉。我检查了,我的tomcat的lib文件夹中似乎没有任何jsf-jar。

标签: java maven jsf tomcat


【解决方案1】:

此问题表明您在运行时类路径中的其他位置有另一个 JSF API 库,该库由 JRE 或 Tomcat 本身加载,而不是由 webapp 加载。这样,webapp 提供的 JSF impl 库就无法找到正确的 API,从而导致这个异常+trace。

换句话说,运行时类路径是脏的。清理它。摆脱随机放置在错误位置的 JAR。其中包括 Tomcat 自己的 /lib 文件夹、JRE 的 /lib/lib/ext 文件夹。另一方面,如果您确保从不将 JAR 随机放入 webapp 的运行时类路径所涵盖的文件夹中,那么一切都会好起来的。

另一个潜在的原因是您在 web 应用程序本身中提供了多个不同版本的 JSF API 库,但此信息在当前形式的问题中不可见。探索Maven构建的WAR文件的/WEB-INF/lib文件夹一定能找到线索。

【讨论】:

  • 我发现了问题!我已将 PrimeFaces 添加到 lib 文件夹中,我认为这不会导致问题,但是当您提到我应该清理我的类路径时,我想到了尝试删除它的想法。 tomcat 现在可以正常启动了。谢谢!
  • 不客气。不过,仅 PrimeFaces(以primefaces.jar 的风格)不应导致此特定异常。它根本不包含 JSF API。还有更多的事情。区别见stackoverflow.com/questions/2167509/…
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2014-08-30
  • 2012-02-09
相关资源
最近更新 更多