cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Hunsberger <peter.hunsber...@gmail.com>
Subject Re: Cocoon 2.2 in servlet 3.0 environment fails to initialize when webjars present on classpath.
Date Wed, 28 Sep 2016 17:39:57 GMT
Hi Leszek,

although there are a few of us still hanging around I suspect you're
going to have to figure this one out on your own.  Running Cocoon
under Jetty is interesting to me personally but I won't have any time
to look at this in the near future...
Peter Hunsberger


On Wed, Sep 28, 2016 at 4:11 AM, Leszek Gawron <lgawron@mobilebox.pl> wrote:
> I wonder if there is still anyone able to answer my question but still:
>
> I have found a problem that prevents deploying cocoon to 3.0 containers if
> the webapp contains webjars - by webjar I mean a jar containing
> META-INF/resources folder which is specially treated by sevlet container
> (the resources from that folder are served by container itself bypassing any
> webapp setup).
>
> This happens on jetty 9.x. No matter if I set webapp to be 2.5 servlet
> compliant or 3.0.
> Does not happen on jetty 8 which is ancient as of now.
>
>
> I try running my app in embedded Jetty 9 - it works - as long as there is no
> actual .war - there is no scanning for META-INF resources.
>
> As soon as I build a war this is how a configured context looks like:
>
>
> startup of context o.e.j.w.WebAppContext@5bcab519{/,[
>
> file:///C:/cygwin/tmp/jetty-0.0.0.0-8080-root.war-_-any-1513195852101013802.dir/webapp/,
> jar:file:///C:/temp/jetty/mywebapp/smart-libs/modernizr-2.8.3.jar!/META-INF/resources,
> jar:file:///C:/temp/jetty/mywebapp/smart-libs/openlayers-3.2.0.jar!/META-INF/resources,
> jar:file:///C:/temp/jetty/mywebapp/smart-libs/bootstrap-3.3.2.jar!/META-INF/resources,
> jar:file:///C:/temp/jetty/mywebapp/smart-libs/jquery-1.11.1.jar!/META-INF/resources],UNAVAILABLE}
> {C:\temp\jetty-gemini\gemini/root.war}
>
> suddenly there is more than one root for static resources.
>
> This yields following error:
>
> org.springframework.beans.factory.BeanCreationException: Error creating bean
> with name 'org.apache.cocoon.Processor': Initialization of bean failed;
> nested exception is org.springframework.beans.factory.BeanCreationException:
> Unable to initialize Avalon component with role org.apache.cocoon.Processor;
> nested exception is
> org.apache.avalon.framework.configuration.ConfigurationException: Cannot
> resolve context://sitemap.xmap
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
>         at
> org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
>         at
> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
>         at
> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
>         at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
>         at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
>         at
> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:759)
>         at
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
>         at
> org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:434)
>         at
> org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
>         at
> org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
>         at
> org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:843)
>         at
> org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:533)
>         at
> org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:816)
>         at
> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:345)
>         at
> org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1404)
>         at
> org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1366)
>         at
> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778)
>         at
> org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262)
>         at
> org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:520)
>         at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
>         at
> org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41)
>         at
> org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188)
>         at
> org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499)
>         at
> org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147)
>         at
> org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180)
>         at
> org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:458)
>         at
> org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
>         at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610)
>         at
> org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529)
>         at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392)
>         at org.eclipse.jetty.util.Scanner.doStart(Scanner.java:313)
>         at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
>         at
> org.eclipse.jetty.deploy.providers.ScanningAppProvider.doStart(ScanningAppProvider.java:150)
>         at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
>         at
> org.eclipse.jetty.deploy.DeploymentManager.startAppProvider(DeploymentManager.java:561)
>         at
> org.eclipse.jetty.deploy.DeploymentManager.doStart(DeploymentManager.java:236)
>         at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
>         at
> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131)
>         at org.eclipse.jetty.server.Server.start(Server.java:411)
>         at
> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:113)
>         at
> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
>         at org.eclipse.jetty.server.Server.doStart(Server.java:378)
>         at
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
>         at
> org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1516)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at
> org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1441)
>         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.eclipse.jetty.start.Main.invokeMain(Main.java:214)
>         at org.eclipse.jetty.start.Main.start(Main.java:457)
>         at org.eclipse.jetty.start.Main.main(Main.java:75)
> Caused by: org.springframework.beans.factory.BeanCreationException: Unable
> to initialize Avalon component with role org.apache.cocoon.Processor; nested
> exception is
> org.apache.avalon.framework.configuration.ConfigurationException: Cannot
> resolve context://sitemap.xmap
>         at
> org.apache.cocoon.core.container.spring.avalon.AvalonBeanPostProcessor.postProcessBeforeInitialization(AvalonBeanPostProcessor.java:258)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:408)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
>         ... 54 more
> Caused by: org.apache.avalon.framework.configuration.ConfigurationException:
> Cannot resolve context://sitemap.xmap
>         at
> org.apache.cocoon.components.treeprocessor.TreeProcessor.configure(TreeProcessor.java:230)
>         at
> org.apache.avalon.framework.container.ContainerUtil.configure(ContainerUtil.java:202)
>         at
> org.apache.cocoon.core.container.spring.avalon.AvalonBeanPostProcessor.postProcessBeforeInitialization(AvalonBeanPostProcessor.java:246)
>         ... 57 more
> Caused by: java.net.MalformedURLException: context://sitemap.xmap could not
> be found. (possible context problem)
>         at
> org.apache.cocoon.components.source.impl.ContextSourceFactory.getSource(ContextSourceFactory.java:128)
>         at
> org.apache.cocoon.components.source.CocoonSourceResolver.resolveURI(CocoonSourceResolver.java:153)
>         at
> org.apache.cocoon.components.source.CocoonSourceResolver.resolveURI(CocoonSourceResolver.java:183)
>         at
> org.apache.cocoon.components.treeprocessor.TreeProcessor.configure(TreeProcessor.java:228)
>         ... 59 more
>
> This is the problematic ContextSourceFactory code:
>
>     public Source getSource(String location, Map parameters) throws
> IOException {
>         if (getLogger().isDebugEnabled()) {
>             getLogger().debug("Creating source object for " + location);
>         }
>
>         // Lookup resolver
>         SourceResolver resolver = null;
>         try {
>             resolver = (SourceResolver)
> this.manager.lookup(SourceResolver.ROLE);
>
>             // Remove the protocol and the first '/'
>             final int pos = location.indexOf(":/");
>             final String scheme = location.substring(0, pos);
>             final String path = location.substring(pos + 2);
>
>             // fix for #24093, we don't give access to files outside the
> context:
>             if (path.indexOf("../") != -1) {
>                 throw new MalformedURLException("Invalid path ('../' is not
> allowed) : " + path);
>             }
>
>             URL u;
>
>             // Try to get a file first and fall back to a resource URL
>             String actualPath = this.servletContext.getRealPath(path);
>             if (actualPath != null) {
>                 u = new File(actualPath).toURL();
>             } else {
>                 u = this.servletContext.getResource(path);
>             }
>
>             if (u != null) {
>                 Source source = resolver.resolveURI(u.toExternalForm());
>                 if ( parameters != null
>                      && BooleanUtils.toBoolean("force-traversable")
>                      && this.servletContext != null
>                      && !(source instanceof TraversableSource) ) {
>                     final Set children =
> this.servletContext.getResourcePaths(path + '/');
>                     if ( children != null ) {
>                         source = new TraversableContextSource(source,
> children, this, path, scheme);
>                     }
>                 }
>                 return source;
>             }
>
>             final String message = location + " could not be found.
> (possible context problem)";
>             getLogger().info(message);
>             throw new MalformedURLException(message);
>         } catch (ServiceException se) {
>             throw new SourceException("Unable to lookup source resolver.",
> se);
>         } finally {
>             this.manager.release(resolver);
>         }
>     }
>
> If I use jetty 8
> String actualPath = this.servletContext.getRealPath(path);
>
> never returns null - even if the path we ask for does not exist.
>
> If I use jetty 9:
> - if there is a single resource root (webapp directory) and no webjars - the
> path is returned
> - if there is a multi resource setup (with webjars) - every webjar is
> scanned for sitemap.xmap resource. The resource is nowhere to be found -
> null is returned which by jetty/servlet spec api docs is a PROPER response.
>
> if the path is null ContextSourceFactory falls back to:
>
>  u = this.servletContext.getResource(path);
>
> ... which is also null in this problematic case.
>
>
> What is the proper way of handing this problem?
>
>    LG

Mime
View raw message