2013-03-03 36 views
1
Mar 03, 2013 12:09:05 PM org.apache.catalina.core.ApplicationContext log 
INFO: Marking servlet Faces Servlet as unavailable 
Mar 03, 2013 12:09:05 PM org.apache.catalina.core.StandardContext loadOnStartup 
SEVERE: Servlet /mavenproject1 threw load() exception 
java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1713) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558) 
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:527) 
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:509) 
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:137) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5033) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5317) 
    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.deployDescriptor(HostConfig.java:657) 
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1637) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

當我試圖用Faces Servlet部署一個應用程序時,我得到了這個堆棧跟蹤。 這意味着沒有FacesServlet可用,但顯然不是這種情況,因爲這些庫在WAR中可用。Tomcat 7.0.37 JSF應用程序部署ClassNotFound FacesServlet

  • JSF-API-2.2.0-m09.jar
  • JSF-IMPL-2.2.0-m09.jar
  • 的JavaEE的Web-API-6.0.jar

我對於可能出錯的事情沒有任何線索。正如標題所述,我使用的是Tomcat 7.0.37。

+3

例外不說謊。這些庫在WAR的'/ WEB-INF/lib'中肯定不存在。我看到你在使用Maven。提取並探索Maven製作的WAR,你會看到。相應地重新提出問題;這不是一個JSF問題,而是一個Maven問題。 – BalusC 2013-03-03 11:59:54

+0

如問題中所述,JAR的列表是WAR內的一個('PROJECT/target/PROJECT.war/WEB-INF/lib /')。這就是發佈這件事的確切原因,你說得對,雖然例外不是謊言。 – Aquillo 2013-03-03 12:32:27

+0

我已經嘗試過使用另一個項目,但Tomcat仍然從上面(從第一個項目)拋出錯誤。即使這個應用程序不再部署? – Aquillo 2013-03-03 14:23:11

回答

2

問題很可能與javaee-web-api-6.0.jar。這個jar包含javax.servlet.*類。當Tomcat在這個jar中發現它們時,它會阻塞classloading的jar。這意味着根本沒有這個jar的類可以加載!包括其中的javax.faces.webapp.FacesServlet。見servlet規範(3.0),第10.7.2:

,一個容器用於加載在WAR一個servlet必須允許開發者裝載以下普通Java包含在WAR內庫JAR任何資源類加載器SE語義使用getResource。 如Java EE許可協議所述,不屬於Java EE產品一部分的servlet容器不應允許應用程序覆蓋Java SE平臺類(例如java。*和javax。*名稱空間中的那些類),即Java SE不允許修改。容器不應允許應用程序覆蓋或訪問容器的實現類。建議還應該實現應用程序類加載器,以便在WAR中打包的類和資源優先於駐留在容器範圍的庫JAR中的類和資源加載。實現還必須保證對於部署在容器中的每個Web應用程序,對Thread.currentThread.getContextClassLoader()的調用務必返回一個ClassLoader實例,該實例實現本節中指定的合約。此外,ClassLoader實例必須是每個部署的Web應用程序的獨立實例。在回調(包括偵聽器回調)到Web應用程序中之前,容器需要設置線程上下文ClassLoader,並在回調返回後將其設置回原始ClassLoader。

清理你的依賴關係!

+0

這意味着我不能在'javax.servlet'中使用任何類? – Aquillo 2013-03-03 15:48:04

+0

不,這意味着你不應該把它們打包在你的戰爭中。它們由servlet容器向您提供**。檢查[maven提供的範圍](http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope)。 – madhead 2013-03-03 15:49:26

+0

啊,像這樣。謝謝!將清理我的依賴。在你提到清理tomcat安裝的另一個評論中,我應該如何擺脫舊的部署?從'/ work'目錄中移除文件夾(我是Tomcat的新手)? – Aquillo 2013-03-03 16:01:00

相關問題