2011-10-25 22 views
20

मैं ध्यान दें कि जब मेरे JSF 2 webapp घाट पर चल रहे सेटअप करने के लिए कोशिश कर रहा है, मैं इस त्रुटि है:फैक्टरी नहीं मिल सकता है: javax.faces.context.FacesContextFactory

java.lang.IllegalStateException: आवेदन नहीं था ठीक से स्टार्टअप पर प्रारंभ, लगता है नहीं कर सका फैक्टरी: javax.faces.context.FacesContextFactory

जो आसानी से मेरे web.xml को यह जोड़कर हल किया जाता है

<listener> 
    <listener-class> 
     com.sun.faces.config.ConfigureListener 
    </listener-class> 
</listener> 

मैं एक विस्तृत विवरण के लिए, लेकिन व्यर्थ में खोज की कोशिश की है ..

घाट-Maven-प्लगइन: 8.0.3.v20111011: रन + JDK 7 + ग्रहण नील

और यहाँ मेरी Maven निर्भरता है:

<dependencies> 
    <dependency> 
     <groupId>org.glassfish</groupId> 
     <artifactId>javax.faces</artifactId> 
     <version>2.1.3</version> 
     <scope>compile</scope> 
    </dependency> 
</dependencies> 

यहाँ मेरी web.xml है:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <display-name>Basic Setup Web Application</display-name> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 
    <listener> 
     <listener-class> 
      com.sun.faces.config.ConfigureListener 
     </listener-class> 
    </listener> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
</web-app> 

और यहाँ घाट प्लगइन का उत्पादन है:

[INFO] <<< jetty-maven-plugin:8.0.3.v20111011:run (default-cli) @ BasicSetup <<< 
[INFO] 
[INFO] --- jetty-maven-plugin:8.0.3.v20111011:run (default-cli) @ BasicSetup --- 
[INFO] Configuring Jetty for project: BasicSetup Maven Webapp 
[INFO] webAppSourceDirectory C:\Users\albert\workspace\BasicSetup\src\main\webapp does not exist. Defaulting to C:\Users\albert\workspace\BasicSetup\src\main\webapp 
[INFO] Reload Mechanic: automatic 
[INFO] Classes = C:\Users\albert\workspace\BasicSetup\target\classes 
[INFO] Context path = /basicSetup 
[INFO] Tmp directory = C:\Users\albert\workspace\BasicSetup\target\tmp 
[INFO] Web defaults = org/eclipse/jetty/webapp/webdefault.xml 
[INFO] Web overrides = none 
[INFO] web.xml file = file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/WEB-INF/web.xml 
[INFO] Webapp directory = C:\Users\albert\workspace\BasicSetup\src\main\webapp 
2011-10-25 14:24:51.091:INFO:oejs.Server:jetty-8.0.3.v20111011 
2011-10-25 14:24:51.334:INFO:oejpw.PlusConfiguration:No Transaction manager found - if your webapp requires one, please configure one. 
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/ 
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/ 
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/ 
2011-10-25 14:24:52.149:WARN:/basicSetup:unavailable 
java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory 
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:967) 
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:316) 
    at javax.faces.webapp.FacesServlet.init(FacesServlet.java:302) 
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:456) 
    at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:276) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:779) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:255) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1212) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:610) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:453) 
    at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:256) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:167) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:262) 
    at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.java:65) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:511) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:364) 
    at org.mortbay.jetty.plugin.JettyRunMojo.execute(JettyRunMojo.java:514) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:107) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:534) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
[INFO] Started Jetty Server 
2011-10-25 14:24:52.165:INFO:oejs.AbstractConnector:Started [email protected]:8080 STARTING 
[INFO] Starting scanner at interval of 10 seconds. 

कोई विचार?

+0

क्या आपके पास मोजोजरा निर्भरता है? – Bozho

+0

@ बोझो: मैं हां मानता हूं, क्योंकि श्रोता टैग को जोड़कर यह – bertie

उत्तर

28

यह श्रोता तब से है जब JSF 1.x स्वचालित रूप से jsf_core.tld टैग लाइब्रेरी परिभाषा फ़ाइल द्वारा पंजीकृत होना चाहिए। आप इसे जेएसएफ कार्यान्वयन जेएआर फ़ाइल के /META-INF फ़ोल्डर में पा सकते हैं। Mojarra 2.1.3 (जो आप लॉग अनुसार ज़रिये जुड़े हुए हैं) के मामले में, के रूप में लाइन 80 से और पर इस प्रकार श्रोता पंजीकृत है:

<!-- ============== Configuration Listener ============== --> 

<!-- 
     This ServletContextListener initializes the runtime environment 
     of the JavaServer Faces Reference Implementation when a web 
     application including it is initialized by the container. 
--> 
<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener>  

बहरहाल, यह जाहिरा तौर पर जेट्टी से ठीक से नहीं उठाया गया है किया गया । मैंने कहीं भी पढ़ा है कि जब FacesServlet से पहले शुरू किया गया है तो टीएलडी फ़ाइल संसाधित की गई है, तो आपको यह अपवाद भी मिल जाएगा। शायद यह जेटी में हो रहा है। एक और दूसरे को बाहर करने के लिए, <load-on-startup> एंट्री को हटाने का प्रयास करें ताकि इसे केवल पहले कंक्रीट HTTP अनुरोध पर लोड किया जा सके, टीएलडी संसाधित होने के ठीक बाद। किसी भी तरह से, web.xml में श्रोता को स्पष्ट रूप से पंजीकृत करना वास्तव में इसे हल करना चाहिए।

आगे, जेएसएफ 2.x के अलावा, टीएलडी फ़ाइल के अतिरिक्त, श्रोता को एक ग्लासफ़िश 3 बग को काम करने के लिए JAR फ़ाइल में स्वचालित रूप से ServletContainerInitializer कार्यान्वयन द्वारा पंजीकृत किया जाना चाहिए। Mojarra 2.x में इस com.sun.faces.config.FacesInitializer वर्ग जो लाइन 131 पर शुरू निम्नलिखित लाइनों है: (! माना जाता है कि)

// The following line is temporary until we can solve an ordering 
// issue in V3. Right now the JSP container looks for a mapping 
// of the FacesServlet in the web.xml. If it's not present, then 
// it assumes that the application isn't a faces application. In this 
// case the JSP container will not register the ConfigureListener 
// definition from our TLD nor will it parse cause or JSP TLDs to 
// be parsed. 
servletContext.addListener(com.sun.faces.config.ConfigureListener.class); 

यह सर्वलेट में काम करता है 3.0 ऐसे बिलाव 7, Glassfish 3, जेट्टी 8 के रूप में केवल कंटेनर,, आदि। आप Jetty 8.0 का उपयोग कर रहे हैं जो इस प्रकार सर्वलेट 3.0 का पालन करना चाहिए, लेकिन आपके web.xml को सर्वलेट 2.5 अनुरूप घोषित किया गया है, इसलिए कंटेनर सर्वलेट 2.5 फ़ॉलबैक मोडस में चलाएगा। सर्वलेट 3.0 को अनुरूप बनाने के लिए अपने web.xml को बदलना इस प्रारंभकर्ता को ट्रिगर करना चाहिए।

+0

काम करता है मैंने लोड-ऑन-स्टार्टअप को हटाने और 3.0 पर स्विच करने की कोशिश की है, लेकिन फिर भी वही विफलता के साथ। मुझे लगता है कि चीजों का परीक्षण करने के लिए फिर से tomcat7 पर जाने का समय है। मैं मेवेन प्लगइन के साथ विस्फोटित युद्ध के साथ जल्दी से तैनात करने की क्षमता के लिए जेटी का उपयोग करने के बारे में सोच रहा था। बाद में tomcat7 में काम करने के लिए मुझे अन्य तरीकों का पता चल जाएगा। धन्यवाद ! – bertie

+0

आपका स्वागत है। – BalusC

+0

जेट्टी 8 "एनोटेशन" सुविधा को सक्षम करने के बाद, मैंने पाया कि जेट्टी ग्लासफ़िश से जैस्पर का एक संस्करण उपयोग करता है जो जानबूझकर टीएलडी फ़ाइल में परिभाषित मोज़रा कॉन्फ़िगर लिस्टनर को छोड़ देता है। इसके अलावा, Mojarra FacesInitializer Mojarra ConfigureListener को पंजीकृत नहीं करेगा यदि FacesServlet को web.xml में परिभाषित किया गया है। मुझे कस्टम ServletContainerInitializer पंजीकृत करके हालांकि यह काम करने के लिए मिला। अधिक जानकारी के लिए, देखें [जेटी पर जेएसएफ पोर्टलेट्स को तैनात करना] (http://www.liferay.com/community/wiki/-/wiki/Main/Deploying+JSF+Portlets+on+Jetty) और [FACES-1668] (http://issues.liferay.com/browse/FACES-1668)। –

0

एक और संकल्प: मुझे यह त्रुटि मिली है जब मैंने wsdl से सीएक्सएफ के साथ फ्लाई पर जावा फाइलें बनाई हैं।

JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(); 
Client client = factory.createClient(wsdlURL, serviceName); 

सीएक्सएफ अपने स्वयं के क्लासलोडर (URLClassLoader का उदाहरण) थ्रेड के क्लासलोडर में रखता है। यह सामान्य तरीका काम करता है, जब तक कि उपयोगकर्ता का धागा जेएसएफ के फैक्टरीफाइंडर में न हो जाए, जिसे क्लासलोडर द्वारा कुंजी के रूप में कैश किया जाता है। क्योंकि क्लासलोडर बदल गया है, यह एक नया फैक्टरी मैनेजर बनाता है, जिसे प्रारंभ नहीं किया जा सकता है, क्योंकि जब मूल फैक्ट्री मैनेजर शुरू हुआ तो क्रियान्वयन इंस्टेंस सूचियां हटा दी जाती हैं। इसके कारण, कार्यान्वयन कक्षाएं नहीं मिलीं, इसलिए अवैध स्तर अपवाद फेंक दिया गया है।

समाधान: CXF के createClient से पहले मूल क्लासलोडर का बैकअप लें, URLClassLoader को एक चर में सहेजें और मूल क्लासलोडर को थ्रेड पर वापस रखें। जब आप सीएक्सएफ से गतिशील कक्षा तक पहुंचना चाहते हैं, तो इसे URLClassLoader के माध्यम से खोजें जिसे आप एक चर में डालते हैं।

संबंधित मुद्दे