Hello

The documentation, after release of Pax Web 8 is quite outdated... I was
thinking about it since I started the refactoring, but you know... Feel
free to contribute and/or to open a GitHub ticket.

regards
Grzegorz Grzybek

pt., 24 lut 2023 o 14:35 Kevin Schmidt <[email protected]> napisał(a):

> Thanks!  That did the trick.
>
> Does an issue need to be opened to get the documentation link I posted up
> to date?
>
> On Thu, Feb 23, 2023 at 11:01 PM Grzegorz Grzybek <[email protected]>
> wrote:
>
>> Hello
>>
>> Pax Web 8 is (modestly speaking) a huge refactoring of Pax Web 7 - mostly
>> with respect to context handling for Whiteboard specification.
>> I expected that after the upgrade/refactoring, some existing configs and
>> setups will stop working - I tried hard (adding hundreds of new integration
>> tests) to ensure that new behavior is consistent and compliant to all
>> specifications (Servlet API, Whiteboard, HttpService, WAB).
>>
>> *1. Explaining why your configuration doesn't work*
>>
>> All your four setups use
>> "org.eclipse.jetty.servlet.ServletContextHandler" class which are "almost"
>> full web applications - that's why you've correctly assumed you can add a
>> servlet there. However Pax Web 8 uses
>> org.ops4j.pax.web.service.jetty.internal.PaxWebServletContextHandler
>> extension of org.eclipse.jetty.servlet.ServletContextHandler which adds A
>> LOT - mostly related to classloading.
>>
>> I tried your config and simply org.eclipse.jetty.servlet.DefaultServlet
>> wasn't found by system class loader - no wonder...
>>
>> *2. Suggesting better solution*
>>
>> Jetty (I found it to be ... the most flexible of the 3 embeddable
>> runtimes: Jetty, Tomcat, Undertow) has a nice hierarchy of "handlers":
>>
>> AbstractHandler (org.eclipse.jetty.server.handler)
>>   AbstractHandlerContainer (org.eclipse.jetty.server.handler)
>>     HandlerWrapper (org.eclipse.jetty.server.handler)
>>       ScopedHandler (org.eclipse.jetty.server.handler)
>>         ContextHandler (org.eclipse.jetty.server.handler)
>>           ServletContextHandler (org.eclipse.jetty.servlet)
>>             PaxWebServletContextHandler 
>> (org.ops4j.pax.web.service.jetty.internal)
>>             WebAppContext (org.eclipse.jetty.webapp)
>>
>> And if you need resources, you can just use
>> org.eclipse.jetty.server.handler.ContextHandler.
>>
>> Here's the config which I checked that works:
>>
>> <Get name="handler">
>>     <Call name="addHandler">
>>         <Arg>
>>             <New class="org.eclipse.jetty.server.handler.ContextHandler">
>>                 <Set name="resourceBase">/var/html/test</Set>
>>                 <Set name="contextPath">/app</Set>
>>                 <Set name="handler">
>>                     <New 
>> class="org.eclipse.jetty.server.handler.ResourceHandler">
>>                         <Set name="directoriesListed">true</Set>
>>                     </New>
>>                 </Set>
>>             </New>
>>         </Arg>
>>     </Call></Get>
>>
>> I hope this helps ;)
>>
>> regards
>> Grzegorz Grzybek
>>
>> pt., 24 lut 2023 o 03:57 Kevin Schmidt <[email protected]> napisał(a):
>>
>>> Hi,
>>>
>>> I came across this page (
>>> http://ops4j.github.io/pax/web/SNAPSHOT/User-Guide.html#adding-specialized-contexthandlers)
>>> in the Pax-Web documentation on how to configure Jetty to serve up static
>>> content.
>>>
>>> Trying it with Karaf 4.3.7 works, specifically I take a brand new
>>> instance and install the http and webconsole features, and then adding this
>>> to jetty.xml allows serving up files in /var/html/test at
>>> http://localhost:8181/app/....
>>>
>>>   <Get name="handler">
>>>
>>>     <Call name="addHandler">
>>>
>>>       <Arg>
>>>
>>>         <New class="org.eclipse.jetty.servlet.ServletContextHandler">
>>>
>>>           <Set name="contextPath">/app</Set>
>>>
>>>           <Set name="resourceBase">/var/html/test</Set>
>>>
>>>           <Call name="addServlet">
>>>
>>>             <Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
>>>
>>>             <Arg>/</Arg>
>>>
>>>           </Call>
>>>
>>>         </New>
>>>
>>>       </Arg>
>>>
>>>     </Call>
>>>
>>>   </Get>
>>>
>>> However, trying the same thing with 4.4.3 fails.  I did it in an
>>> instance with a bunch of features already installed and got this warning:
>>>
>>> 20230223 18:27:19.312 [WARN ] paxweb-config-3-thread-1 (change
>>> controller) | 268:org.eclipse.jetty.util:9.4.50.v20221201 |
>>> org.eclipse.jetty.xml.XmlConfiguration | Config error at <Call
>>> name="addHandler">
>>>
>>>       <Arg>
>>>
>>>         <New class="org.eclipse.jetty.servlet.ServletContextHandler">
>>>
>>>           <Set name="contextPath">/app</Set>
>>>
>>>           <Set name="resourceBase">/var/html/test</Set>
>>>
>>>           <Call name="addServlet">
>>>
>>>             <Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
>>>
>>>             <Arg>/</Arg>
>>>
>>>           </Call>
>>>
>>>         </New>
>>>
>>>       </Arg>
>>>
>>>     </Call>
>>>
>>> 20230223 18:27:19.313 [WARN ] paxweb-config-3-thread-1 (change
>>> controller) | 268:org.eclipse.jetty.util:9.4.50.v20221201 |
>>> org.eclipse.jetty.xml.XmlConfiguration | Config error at <Get
>>> name="handler">
>>>
>>>     <Call name="addHandler">
>>>
>>>       <Arg>
>>>
>>>         <New class="org.eclipse.jetty.servlet.ServletContextHandler">
>>>
>>>           <Set name="contextPath">/app</Set>
>>>
>>>           <Set name="resourceBase">/var/html/test</Set>
>>>
>>>           <Call name="addServlet">
>>>
>>>             <Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
>>>
>>>             <Arg>/</Arg>
>>>
>>>           </Call>
>>>
>>>         </New>
>>>
>>>       </Arg>
>>>
>>>     </Call>
>>>
>>>   </Get>
>>>
>>> My Karaf 4.3.7 has Jetty 9.4.46 and Pax Web 7.3.25 while Karaf 4.4.3 has
>>> Jetty 9.4.50 and Pax Web 8.0.15
>>>
>>> Did something change with Jetty config that this is no longer valid?  I
>>> wouldn't think so with the change from 9.4.46 to 9.4.50 but it clearly
>>> doesn't work.
>>>
>>> I tried changing the section in jetty.xml to this, using insertHandler
>>> instead:
>>>
>>>     <Call name="insertHandler">
>>>
>>>         <Arg>
>>>
>>>             <New
>>> class="org.eclipse.jetty.servlet.ServletContextHandler">
>>>
>>>                 <Set name="contextPath">/app</Set>
>>>
>>>                 <Set name="resourceBase">/var/html/test</Set>
>>>
>>>                 <Call name="addServlet">
>>>
>>>                     <Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg>
>>>
>>>                     <Arg>/</Arg>
>>>
>>>                 </Call>
>>>
>>>             </New>
>>>
>>>         </Arg>
>>>
>>>     </Call>
>>>
>>> This doesn't have a config error, but instead fails finding the
>>> DefaultServlet class.
>>>
>>> 20230223 18:48:04.276 [WARN ] paxweb-config-3-thread-1 (change
>>> controller) | 268:org.eclipse.jetty.util:9.4.50.v20221201 |
>>> org.eclipse.jetty.servlet.BaseHolder |
>>>
>>> java.lang.ClassNotFoundException:
>>> org.eclipse.jetty.servlet.DefaultServlet
>>>
>>> at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
>>> ~[?:1.8.0_352]
>>>
>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[?:1.8.0_352]
>>>
>>> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
>>> ~[?:1.8.0_352]
>>>
>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_352]
>>>
>>> at org.eclipse.jetty.util.Loader.loadClass(Loader.java:64) ~[?:?]
>>>
>>> at org.eclipse.jetty.servlet.BaseHolder.doStart(BaseHolder.java:89)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:369)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:749)
>>> ~[?:?]
>>>
>>> at
>>> java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
>>> ~[?:1.8.0_352]
>>>
>>> at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:483)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:313)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:647)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
>>> ~[?:?]
>>>
>>> at org.eclipse.jetty.server.Server.start(Server.java:423) ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
>>> ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:97)
>>> ~[?:?]
>>>
>>> at org.eclipse.jetty.server.Server.doStart(Server.java:387) ~[?:?]
>>>
>>> at
>>> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
>>> ~[?:?]
>>>
>>> at
>>> org.ops4j.pax.web.service.jetty.internal.JettyServerWrapper.start(JettyServerWrapper.java:623)
>>> ~[?:?]
>>>
>>> at
>>> org.ops4j.pax.web.service.jetty.internal.JettyServerController.start(JettyServerController.java:109)
>>> ~[?:?]
>>>
>>> at
>>> org.ops4j.pax.web.service.internal.Activator.performConfiguration(Activator.java:555)
>>> ~[?:?]
>>>
>>> at
>>> org.ops4j.pax.web.service.internal.Activator.updateController(Activator.java:445)
>>> ~[?:?]
>>>
>>> at
>>> org.ops4j.pax.web.service.internal.Activator.lambda$updateServerControllerFactory$1(Activator.java:347)
>>> ~[?:?]
>>>
>>> at
>>> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>>> ~[?:1.8.0_352]
>>>
>>> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>>> ~[?:1.8.0_352]
>>>
>>> at
>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>>> ~[?:1.8.0_352]
>>>
>>> at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_352]
>>>
>>> I had run across an earlier issue with Pax Web 8 missing a package
>>> import (https://github.com/ops4j/org.ops4j.pax.web/issues/1817) so is
>>> this another one?  Or what is the correct way to configure serving static
>>> content in jetty.xml with Karaf 4.4 / Pax Web 8?
>>>
>>> Thanks,
>>>
>>> Kevin
>>>
>>>

Reply via email to