Hmm In Pax Web 8+, all resource access methods from resource servlets (JettyResourceServlet, TomcatResourceServlet, UndertowResourceServlet) are handled by javax.servlet.ServletContext#getResource() call - whether it's WAB, HttpService or Whiteboard.
In WAB, this is delegated to org.ops4j.pax.web.extender.war.internal.WebApplicationHelper#getResource() and org.osgi.framework.Bundle#findEntries() - but if not found, META-INF/resources are checked (including fragments). Mind that org.osgi.framework.Bundle#findEntries() method considers fragments as well. In Whiteboard, however by default (see https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e119637) org.osgi.framework.Bundle#getEntry() method is used (not Bundle#findEntries()), which *doesn't check fragments*. See default implementation of org.osgi.service.http.context.ServletContextHelper. This is confusing and unintuitive. However you could register your own org.osgi.service.http.context.ServletContextHelper with changed org.osgi.service.http.context.ServletContextHelper#getResource() method that uses Bundle#findEntries() instead of Bundle#getEntry() - it should work ;) regards Grzegorz Grzybek śr., 11 sty 2023 o 14:31 Jochen Walz <[email protected]> napisał(a): > Hello Grzegorz, > > The WAB approach works - even with the HTML files located under the > bundle's root directory. > > For the whiteboard approach: I only have one resource service class in my > "main" help bundle, i.e., the host bundle, no additional services in the > fragment bundles. Of course, using the same resource pattern multiple times > would create a conflict. My assumption was, since the resource service can > serve the HTML files from the host bundle, it will also use the files from > the fragment bundles, because they share the same class loader. Obviously, > this assumption was wrong. > > So, I searched for an example where somebody has solved that, e.g., by > searching for resources in all attached fragment bundles and make them > available to the resource servlet. Possibly in the activate method of the > resource service. In a similar way as the pax-web-extender-war does it, but > of course much simpler, because there is no need to look for Web > applications, only few folders with resource files. > > If such example doesn't exist, I either must try myself, or just accept a > bit of "overweight" and continue using WAB. > > Regards > Jochen > > Am 11. Januar 2023 12:28:35 MEZ schrieb Grzegorz Grzybek < > [email protected]>: >> >> Hello >> >> With Pax Web 8, fragment bundles attached to WAB are searched for >> "META-INF/resources/" resource - each such resource is added to WAB >> resource path. See for example >> https://github.com/ops4j/org.ops4j.pax.web/tree/web-8.0.15/samples/samples-war/war-required/src/main/resources/META-INF >> >> samples/samples-war/war-required and samples/samples-war/war-requiring >> are _wired_ using Require-Bundle relationship, but normal fragment should >> also work. >> >> Mind that "META-INF/resources" is the recommended approach, specified in >> Servlet API specification and handled fully in Pax Web 8+. >> >> Whiteboard is not an implementation of Web Application specification and >> while bundles can register Whiteboard services into the same target web >> context, it's not possible that two bundles register resources for the same >> mapping to create kind of _overlay_. >> >> regards >> Grzegorz Grzybek >> >> śr., 11 sty 2023 o 11:03 Jochen Walz <[email protected]> >> napisał(a): >> >>> Hi, >>> >>> With Karaf 4.3.6 / Pax Web 7.3.23, I had used a WAB to provide some HTML >>> files for online help, and - depending on the parts of my application which >>> are installed - fragment bundles with additional help files. The war >>> feature handled that correctly. >>> >>> With Karaf 4.4.2, I wanted to switch to using the >>> pax-web-http-whiteboard, providing a resource service in my main help >>> bundle with appropriate settings for HTTP_WHITEBOARD_RESOURCE_PATTERN and >>> HTTP_WHITEBOARD_RESOURCE_PREFIX. Looks bit more lightweight than a WAB. >>> >>> The HTML files from my main help bundle are served correctly, but not >>> the ones from the fragment bundles. >>> >>> So: does somebody know an (easy) way to make resources in fragment >>> bundles visible for the resource service, assumed that all fragments are >>> already installed when the bundle with the resource service is started? >>> Possibly some example exists somewhere. Or would that lead so far that it >>> is by far easier to just keep the WAB approach with the pax-web-war feature? >>> >>> Thanks & Regards, >>> Jochen >>> >>
