Hi Stephan,

that's what I meant by different between wrap and feature processing.

At least, it requires a good documentation and should be considered as
"last chance action" ;)

A fragment could work, but also a dedicated "wrapper" bundle (as we do
for other spec), but that's at build time. Greg is proposing "runtime".

Regards
JB

On 19/03/2019 11:30, Siano, Stephan wrote:
> Hi Jean-Baptiste,
> 
> What Grzegorz is proposing looks to me like some magic behind-the-scenes 
> automatic wrap for all kind of installed bundles.
> 
> I am not sure if this is really such a good idea. If it works, it can make 
> things work that do not work without some significant effort like manually 
> wrapping all bundles that reference the servlet API. If there are issues, you 
> will have a situation, which is extremely hard to analyze with having bundles 
> wiring to other bundles they are not supposed to be wiring according to their 
> manifest.
> 
> Even if that works with servlet API 4.0 for some reason, once that mechanism 
> is there, it will likely be used for other packages, and once you have 
> defined changes to several packages which cause the auto-wrap of dozens of 
> bundles, I really think that it will be very difficult to understand the 
> wiring afterwards.
> 
> Therefore IMHO the least ugly workaround for this issue would be to create a 
> fragment bundle for the servlet-api bundle that exports the packages with 
> some lower version number (e.g. 3.2) that is only installed if it's really 
> necessary. Over time the developers of the bundles referencing the servlet 
> API hopefully asses whether their bundle also works with the servlet 4.0 API 
> and adapt their import ranges accordingly (so the fragment can go away 
> eventually).
> 
> Best regards
> Stephan
> 
> -----Original Message-----
> From: Jean-Baptiste Onofré <j...@nanthrax.net> 
> Sent: Dienstag, 19. März 2019 10:24
> To: dev@karaf.apache.org
> Subject: Re: Idea - how to override bundle headers without wrap:
> 
> Hi Grzegorz
> 
> I think what you are proposing is at different level than wrap.
> 
> wrap is more for single jar (and works "outside" of Karaf) whereas your
> proposal is at feature level.
> 
> It makes sense but we have to keep it simple and clear (in term of
> documentation). I think we should improve the feature processing
> documentation: in which case should I use it, and how to use it.
> 
> But overall +1 to me.
> 
> Regards
> JB
> 
> On 19/03/2019 08:26, Grzegorz Grzybek wrote:
>> Hello
>>
>> I was thinking about one scenario. In my custom distro, I'm using pax-web
>> 7.3.3 (tech preview
>> <https://groups.google.com/d/msg/ops4j/JP5L63Qh4u8/nPG1LN4HAAAJ>) which
>> uses Undertow 2, Tomcat 9 and Servlet API 4.
>>
>> The "problem" is that maven-bundle-plugin, by default (and correctly)
>> generates import ranges according to pom dependencies. So if pom has
>> javax.servlet-api-3.1.0 dep, generated Import-Package header will have
>> (correctly) "[3.1,4.0)" range which is the most natural range according to
>> semantic versioning.
>>
>> The problem is that with some deps (and servlet-api used in
>> "@org.osgi.annotation.versioning.ConsumerType" mode is such dependency)
>> you're safe to use newer version of the API.
>>
>> There were different approaches to this problem, see for example:
>> https://bugs.eclipse.org/bugs/show_bug.cgi?id=385806 where bundles either
>> export packages in many versions or export lower version than one matching
>> directly JavaEE specification. For example,
>> geronimo-servlet_3.0_spec-1.0.jar exports javax.servlet package with
>> version 2.6 and 3.0.
>>
>> What I did (locally) is a little enhancement to new override&blacklisting
>> mechanism configured in etc/org.apache.karaf.features.xml. I added this
>> section for example:
>>
>> <bundleProcessing>
>>     <bundle location="mvn:org.eclipse.jetty*/*">
>>         <add header="Processed-By" value="Karaf Bundle Processor" />
>>         <clause header="Import-Package" name="javax.servlet"
>> value='javax.servlet;version="[3.1.0,5)"' />
>>         <clause header="Import-Package" name="javax.servlet.annotation"
>> value='javax.servlet.annotation;version="[3.1.0,5)"' />
>>         <clause header="Import-Package" name="javax.servlet.descriptor"
>> value='javax.servlet.descriptor;version="[3.1.0,5)"' />
>>         <clause header="Import-Package" name="javax.servlet.http"
>> value='javax.servlet.http;version="[3.1.0,5)"' />
>>     </bundle>
>> </bundleProcessing>
>>
>> My goal was to be able to install for example "camel-websocket" feature
>> which uses jetty which (at version 9.4) requires servlet API 3.1.
>>
>> FeaturesProcessor (the one that currently can override URIs of bundles or
>> entire feature, blacklist features, bundle and repository URIs, has
>> (locally in my branch) ability to transform a bundle when matching some
>> criteria.
>>
>> In the above example, I can override all jetty bundles, so each *individual
>> clause* (unlike with wrap: where you work at header level) can be changed.
>> I can add full headers, remove headers, modify headers or modify individual
>> clauses.
>>
>> For example, to install jetty-util bundle, I had to wrap: it with:
>>
>> wrap:mvn:org.eclipse.jetty/jetty-util/9.4.12.v20180830$overwrite=merge&amp;Import-Package=javax.imageio,javax.naming,javax.naming.ldap,javax.net.ssl,javax.security.auth.x500,javax.xml.parsers,org.slf4j.*;resolution:=optional;version=&quot;[1.7.25,2)&quot;,javax.servlet.*;version=&quot;[3.1,5)&quot;
>>
>> remembering to preserve existing Import-Package clauses.
>>
>> With XML configuration I can focus only on fixing javax.servlet.* import
>> clauses.
>>
>> The transformed (repackaging + manifest change) bundles are stored in (by
>> default) ${karaf.data}/repository-bpr (bpr = bundle processing) directory,
>> which is also explicitly prepended to
>> org.ops4j.pax.url.mvn.defaultRepositories option used by maven resolver
>> used by features service.
>>
>> Fitting into existing features processor mechanism, this change is actually
>> not that big. I see nice potential in it, but I'd very like to get your
>> opinion on it - maybe additional ideas? Or problems with current idea?
>>
>> best regards
>> Grzegorz Grzybek
>>
> 

-- 
Jean-Baptiste Onofré
jbono...@apache.org
http://blog.nanthrax.net
Talend - http://www.talend.com

Reply via email to