Hi, On 07.04.2010, at 11:33, Nicolas Delsaux wrote:
> Hi all, > after having run along the classical Felix tutorials (creating bundles > through maven), i was quite interested by the promises of OSGi, but a > little worried by the way dependencies were resolved. Fortunatly, my > eye felt on iPOJO. I can say I was quite pleased by the promise of IoC > between plugins (what seems to offer iPOJO) especially using > annotations, which may be a fad, but are to my mind very useful. > > Before all, I must confess I'm a converted maven user, which may alter > some of my points of view. > > So, I've tried to do the maven tutorial > (http://felix.apache.org/site/ipojo-hello-word-maven-based-tutorial.html) > using a well-known maven way : a superpom containing my poms basic > definitions and one module for each feature : a hello-service module, > and a hello-client one. Before all, I have to say I used this > architecture for classical Felix tutorials, and it perfectly worked. > So, my modules pom were quite light, and so were my classes. > In these classes, I defined the HelloService interface, a HelloImpl > provider (with @Component and @Provides) annotation, and a HelloClient > using @Requires annotation, as well as @Validates one to start the > hello world code. > Having done so, it seemed to me I didn't had to create a metada.xml > file, since all informations were in these annotations. Was I > theorically right ? > Well, in the facts, i was wrong since : > - my jars METADATA.INF don't contain any of the data defined by both > parent and module maven-bundle-plugin configuration > - the maven log don't reveal any maven-bundle-plugin execution (which > may be the reason for the lack of METADATA.INF) ... well, this one was > found and resolved : my modules didn't packaged themselves as "bundle" > ... stupid of me ! > - once the above is corrected, my METADA.INF were created, my bundles > had their correct names set in felix, but the @Validate method of my > client was never called. FTR, here is my full hello client : > > @Component(name="Da Hello Klient") > public class HelloClient { > private static final Logger logger = Logger.getLogger(HelloClient.class > .getName()); > > @Requires > private HelloService service; > > private String user = System.getProperty("user.name"); > > @Validate > public void hello() { > logger.info(service.sayHello(user)); > } > > @Invalidate > public void goodbye() { > logger.info(service.sayGoodbye(user)); > } > } > > And the associated METADATA.INF > > Manifest-Version: 1.0 > Export-Package: com.mycompany.hello.api > Built-By: ndx > Tool: Bnd-0.0.238 > Bundle-Name: com.mycompany.hello > Created-By: Apache Maven Bundle Plugin > Bundle-Vendor: Perigee > Build-Jdk: 1.6.0_16 > Bundle-Version: 0.0.1.SNAPSHOT > Bnd-LastModified: 1270632257171 > Bundle-ManifestVersion: 2 > Bundle-Description: Dis bonjour au monde ! > Import-Package: com.mycompany.hello.api > Bundle-SymbolicName: com.mycompany.hello-service > Bundle-DocURL: http://www.mycompany.fr > > So, here are my questions : > - Do I absolutely need a metada.xml file ? > - Is the validate method really called once all dependencies have > been resolved and my iPOJO can be started ? So for the metadata.xml, no it's absolutely not required to have one. But in the 1.4.0, the metadata.xml allows to declare instances. (in the 1.5.0-SNAPSHOT, there is a new annotation for that). The validate method will be call if you have declared an instance of your component. iPOJO interprets @Component as a component type declaration, so you have to declare instances. To declare instances, you can use the configu admin or the metadata.xml. In this latter case, just create a simple metadata.xml containing <ipojo> <instance component="....HelloClient"/> </ipojo> But as far as I see, the maven-ipojo-plugin was not called on your bundle. So add to your pom file the following excerpt: <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-ipojo-plugin</artifactId> <version>1.4.2</version> <executions> <execution> <goals> <goal>ipojo-bundle</goal> </goals> </execution> </executions> </plugin> Then, the resulting manifest should contains a specific header with a weird content. If so, your bundle was correctly manipulated, and your bundle will be managed by iPOJO. Regards, Clement > > Thanks > > -- > Nicolas Delsaux > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] >

