On the whole I agree. I didn't mean to suggest that embedding all dependencies was a good thing. All I was trying to say is that if you're going to embed, do that before tweaking the imports.
Where I slightly disagree is that I don't think embedding is just for corner cases. I haven't developed hard and fast rules for when to embed and when not to; all I can suggest is to think carefully before embedding. Oh, and never embed Spring :) Justin On Jun 10, 2011, at 5:39 PM, [email protected] wrote: > > > Justin, > > > > Do you feel that embedding all of a file's dependencies into a bundle is the > right approach? I think it contravenes some of the core principles of OSGi > to embed dependencies except in some rare corner-cases. > > > > > ----- Original Message ----- > From: "Justin Edelson" <[email protected]> > To: [email protected] > Sent: Friday, June 10, 2011 5:22:43 PM > Subject: Re: Felix maven-bundle-plugin transitive dependency issue > > I would highly recommend not using resolution=optional with * > > It would be very atypical for *all* imports to truly be optional. When you > use optional imports blindly like this you will inevitably end up with the > wrong class space at some point. > > What I generally advise people is this: > 1) deal with embedding first. > 2) don't use transitive embeds - list all dependencies to be embedded with a > scope of compile and use the scope selector to pick all compile scope > dependencies > 3) once embedding is configured, configure the exports (if any) by explicitly > listing the packages and versions > 4) finally, iteratively tweak the auto-generated imports > > Shamik - I'd suggest you file bug report with a reproduceable test case. > > Justin > > On Jun 10, 2011, at 5:08 PM, sam lee <[email protected]> wrote: > >> freemarker and gwt are just examples.. >> >> >> Let's say I have a maven module that depends on: >> >> <dependency> >> <groupId>mysql</groupId> >> <artifactId>mysql-connector-java</artifactId> >> <version>5.1.9</version> >> </dependency> >> >> >> To make the dependency work in the osgi bundle, I had to: >> <Import-Package> >> *;resolution:=optional >> </Import-Package> >> <Embed-Dependency> >> mysql-connector-java;scope=compile|runtime >> </Embed-Dependency> >> >> >> I tried various combinations of maven-bundle-plugin.. but I only found the >> above working. >> >> >> My intuition is: >> >> 1. List <dependency>s that are not provided (<scope> isn't provided). >> 2. List them under Embed-Dependency. >> 3. Import-Package *;resolution:=optional >> 4. If things don't work, add <Embed-Transitive>true</Embed-Transitive> >> >> >> Or, like you mentioned, you can decipher >> http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html >> and look at the source code for maven-bundle-plugin. >> >> It's pretty simple. It's Java. (sarcasm). >> >> >> >> On Fri, Jun 10, 2011 at 3:47 PM, Shamik Bandopadhyay >> <[email protected]>wrote: >> >>> Sam, I just tried and it worked great. Just for my understanding, can >>> you please explain how do decide to include freemarker and gwt and not >>> the remaining package reference? >>> >>> On Fri, Jun 10, 2011 at 12:25 PM, sam lee <[email protected]> wrote: >>>> Try it and see. Does it work? >>>> >>>> I wouldn't try to reason Java complexity, OSGi. >>>> >>>> On Fri, Jun 10, 2011 at 3:20 PM, <[email protected]> wrote: >>>> >>>>> >>>>> >>>>> Shamik, >>>>> >>>>> >>>>> >>>>> I completely understand how you feel about making bundles out of >>>>> non-bundled .jar files. The standard answer is to contact the vendor and >>>>> have them make bundles for you. However, this can take a while to >>> accomplish >>>>> and sometimes, especially for open-source .jar's, it may be difficult to >>>>> get in touch with the folks who made the original .jar file. In >>> addition to >>>>> that method, there are a couple of quick and easy ways to make a osgi >>> bundle >>>>> out of a non-osgi .jar file. >>>>> >>>>> >>>>> >>>>> First, you may want to consider using Karaf. This product can ride of >>> top >>>>> of felix (or equinox), and it has a number of helper functions that will >>>>> make your job easier. >>>>> >>>>> >>>>> >>>>> Second, when you install a non-bundled .jar file into Felix, try using >>> the >>>>> following syntax: >>>>> >>>>> osgi:install wrap:mvn:<artifactId>/<groupId>/version >>>>> >>>>> >>>>> >>>>> I haven't tried this in Felix, but in Karaf over the top of Felix, this >>>>> will automagically wrap your non-osgi bundle. "Wrapping" in the process >>> of >>>>> using a tool to add osgi-stuff into a non-osgi .jar file's MANIFEST.MF >>>>> file. While this may not be the best approach for an operational >>>>> environment, this will definately help you get your test stuff working. >>>>> >>>>> >>>>> >>>>> To make a more operational-ready bundle, you can use the bnd tool to >>> wrap >>>>> your existing bundle. Bnd is a very powerful tool and is pretty well >>>>> documented. Google it for more information. >>>>> >>>>> >>>>> >>>>> Please let me know if this helps! >>>>> >>>>> >>>>> ----- Original Message ----- >>>>> From: "Shamik Bandopadhyay" <[email protected]> >>>>> To: [email protected] >>>>> Sent: Friday, June 10, 2011 2:52:09 PM >>>>> Subject: Re: Felix maven-bundle-plugin transitive dependency issue >>>>> >>>>> Hi, >>>>> >>>>> Thanks for your reply. Being a newbie, I'm finding a li'l hard to >>>>> grasp the concept maybe. I agree, that embedding transitive dependency >>>>> might not be the greatest idea since it contradicts OSGI fundamental. >>>>> But at the sametime what bothers me is how do we address the non-osgi >>>>> jars ? I can "n" number of jars in my project which maybe have other >>>>> transitive dependencies. I don't see how efficient is the process of >>>>> manually identifing them and make them OSGi enabled. I found the >>>>> transitive dependency support comes handy in these cases. >>>>> >>>>> Unfortunately, I'm still not able to figure out how the >>>>> <Embed-Transitive> property works for the maven-plugin-bundle. >>>>> After,trying all possible combinations(so far), I haven't seen a >>>>> single instance where a transitive jar got embedded in the bundle. >>>>> >>>>> I perhaps, need to do more reading to understand this. >>>>> >>>>> Can you pls share any pointers for best practises in this regard? >>>>> >>>>> Appreciate your help... >>>>> >>>>> -Thanks >>>>> >>>>> On Fri, Jun 10, 2011 at 11:41 AM, <[email protected]> wrote: >>>>>> >>>>>> >>>>>> Shamik, >>>>>> >>>>>> >>>>>> >>>>>> Embedding the transitive dependencies is one of those things that you >>> can >>>>> do in OSGi, but usually you shouldn't. The problem is that your bundle >>> is >>>>> likely not going to use most of the transitive dependencies. So, >>> embedding >>>>> them into your bundle can leave you with a much larger bundle than you >>>>> really need with a bunch of "stuff" you don't need. Another problem >>> that >>>>> you'll see when embedding transitive dependencies is that you may run >>> into a >>>>> circumstance where a transitive dependency (especially for older stuff) >>>>> isn't available any more. In this case, your build will break. >>>>>> >>>>>> >>>>>> >>>>>> A better approach is to identify those bundles that you are actually >>>>> going to use (which you've already done), and deploy those into OSGi >>> before >>>>> you deploy your taxonomy dao bundle. A rule of thumb that I use is, if >>> a >>>>> bundle is listed in the dependencies section of the pom, that bundle >>> should >>>>> be available within OSGi. >>>>>> >>>>>> >>>>>> >>>>>> So, in short, try not embedding any dependencies in your bundle; >>> instead, >>>>> deploying all of the necessary bundles into OSGi first. If that doesn't >>>>> work, only then should you try to embed. >>>>>> >>>>>> >>>>>> >>>>>> Please let me know if that helps! >>>>>> >>>>>> >>>>>> ----- Original Message ----- >>>>>> From: "Shamik Bandopadhyay" <[email protected]> >>>>>> To: [email protected] >>>>>> Sent: Friday, June 10, 2011 1:56:54 PM >>>>>> Subject: Felix maven-bundle-plugin transitive dependency issue >>>>>> >>>>>> Hi, >>>>>> >>>>>> I'm new to OSGI and trying to deploy my first application. I've a >>>>>> spring dependency in my pom. While deploying I realized that Felix >>>>>> runtime requires all transitive dependencies to install the bundle >>>>>> properly. Since then, I'm sort of struggling to resolve this issue. >>>>>> I've tried embedded-dependency and embedded-transitive options, but of >>>>>> no luck. Here's my pom. >>>>>> >>>>>> >>>>>> <project xmlns="http://maven.apache.org/POM/4.0.0" >>>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >>>>>> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 >>>>>> http://maven.apache.org/xsd/maven-4.0.0.xsd"> >>>>>> <modelVersion>4.0.0</modelVersion> >>>>>> <groupId>com.test</groupId> >>>>>> <artifactId>taxonomydaobundle</artifactId> >>>>>> <version>1.0.0</version> >>>>>> <packaging>bundle</packaging> >>>>>> <name>Taxonomy Dao Bundle</name> >>>>>> <url>http://maven.apache.org</url> >>>>>> <repositories> >>>>>> <repository> >>>>>> <id>fusesource</id> >>>>>> <url>http://repo.fusesource.com/maven2</url> >>>>>> <snapshots> >>>>>> <enabled>false</enabled> >>>>>> </snapshots> >>>>>> <releases> >>>>>> <enabled>true</enabled> >>>>>> </releases> >>>>>> </repository> >>>>>> <repository> >>>>>> <id>apache-public</id> >>>>>> <url>https://repository.apache.org/content/groups/public/ >>>>> </url> >>>>>> <snapshots> >>>>>> <enabled>true</enabled> >>>>>> </snapshots> >>>>>> <releases> >>>>>> <enabled>true</enabled> >>>>>> </releases> >>>>>> </repository> >>>>>> </repositories> >>>>>> >>>>>> <properties> >>>>>> >>>>> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> >>>>>> </properties> >>>>>> >>>>>> <dependencies> >>>>>> <dependency> >>>>>> <groupId>com.test</groupId> >>>>>> <artifactId>taxonomymodelbundle</artifactId> >>>>>> <version>1.0.0</version> >>>>>> <scope>compile</scope> >>>>>> </dependency> >>>>>> <dependency> >>>>>> <groupId>org.springframework</groupId> >>>>>> <artifactId>spring</artifactId> >>>>>> <version>2.5.5</version> >>>>>> </dependency> >>>>>> <dependency> >>>>>> <groupId>junit</groupId> >>>>>> <artifactId>junit</artifactId> >>>>>> <version>3.8.1</version> >>>>>> <scope>test</scope> >>>>>> </dependency> >>>>>> </dependencies> >>>>>> >>>>>> <build> >>>>>> <plugins> >>>>>> <plugin> >>>>>> <groupId>org.apache.felix</groupId> >>>>>> <artifactId>maven-bundle-plugin</artifactId> >>>>>> <version>2.0.1</version> >>>>>> <extensions>true</extensions> >>>>>> <configuration> >>>>>> <instructions> >>>>>> >>>>> <Export-Package>com.test.taxonomy.api.*;version=1.0.0 >>>>>> </Export-Package> >>>>>> >>>>>> <Import-Package>com.test.taxonomy.message.*;version=1.0.0, >>>>>> * >>>>>> </Import-Package> >>>>>> >>>>>> <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> >>>>>> <Embed-Transitive>true</Embed-Transitive> >>>>>> </instructions> >>>>>> </configuration> >>>>>> </plugin> >>>>>> <plugin> >>>>>> <groupId>org.apache.maven.plugins</groupId> >>>>>> <artifactId>maven-compiler-plugin</artifactId> >>>>>> <version>2.1</version> >>>>>> <configuration> >>>>>> <source>1.6</source> >>>>>> <target>1.6</target> >>>>>> </configuration> >>>>>> </plugin> >>>>>> </plugins> >>>>>> </build> >>>>>> </project> >>>>>> >>>>>> mvn install only embeds the direct dependency jars in the bundle. >>>>>> When I try to install the bundle in Felix, its throwing import errors >>>>>> as it's failing to resolve the dependencies. Here's a snippet : >>>>>> >>>>>> Imported Packages ERROR: bsh -- Cannot be resolved >>>>>> ERROR: com.caucho.burlap.client -- Cannot be resolved >>>>>> ERROR: com.caucho.burlap.io -- Cannot be resolved >>>>>> ERROR: com.caucho.burlap.server -- Cannot be resolved >>>>>> ERROR: com.caucho.hessian.client -- Cannot be resolved >>>>>> ERROR: com.caucho.hessian.io -- Cannot be resolved >>>>>> ERROR: com.caucho.hessian.server -- Cannot be resolved >>>>>> ERROR: com.ibatis.common.util -- Cannot be resolved >>>>>> ERROR: com.ibatis.common.xml -- Cannot be resolved >>>>>> ERROR: com.ibatis.sqlmap.client -- Cannot be resolved >>>>>> ERROR: com.ibatis.sqlmap.client.event -- Cannot be resolved >>>>>> ERROR: com.ibatis.sqlmap.engine.builder.xml -- Cannot be resolved >>>>>> ERROR: com.ibatis.sqlmap.engine.impl -- Cannot be resolved >>>>>> ERROR: com.ibatis.sqlmap.engine.transaction -- Cannot be resolved >>>>>> ERROR: com.ibatis.sqlmap.engine.transaction.external -- Cannot be >>>>> resolved >>>>>> ERROR: com.ibatis.sqlmap.engine.type -- Cannot be resolved >>>>>> ERROR: com.ibm.wsspi.uow -- Cannot be resolved >>>>>> ERROR: com.jamonapi -- Cannot be resolved >>>>>> ERROR: com.mchange.v2.c3p0 -- Cannot be resolved >>>>>> ERROR: com.sun.enterprise.loader -- Cannot be resolved and overwritten >>>>>> by Boot Delegation >>>>>> ERROR: com.sun.net.httpserver -- Cannot be resolved and overwritten by >>>>>> Boot Delegation >>>>>> ERROR: com.sun.rowset -- Cannot be resolved and overwritten by Boot >>>>> Delegation >>>>>> ERROR: commonj.timers -- Cannot be resolved >>>>>> ERROR: commonj.work -- Cannot be resolved >>>>>> ERROR: edu.emory.mathcs.backport.java.util.concurrent -- Cannot be >>>>> resolved >>>>>> ERROR: freemarker.cache -- Cannot be resolved >>>>>> ERROR: freemarker.template -- Cannot be resolved >>>>>> >>>>>> My understanding was using <Embed-Transitive>true</Embed-Transitive> >>>>>> will embed all transitive dependency jars in the bundle,but apparently >>>>>> that's not been the case so far. >>>>>> >>>>>> I'll appreciate if someone can tell what's the right approach to >>>>>> resolve this issue. >>>>>> >>>>>> -Thanks >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: [email protected] >>>>>> For additional commands, e-mail: [email protected] >>>>>> >>>>>> >>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: [email protected] >>>>> For additional commands, e-mail: [email protected] >>>>> >>>>> >>>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [email protected] >>> For additional commands, e-mail: [email protected] >>> >>> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

