felix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Clement Escoffier <clement.escoff...@gmail.com>
Subject Re: iPOJO annotations with a maven project
Date Wed, 07 Apr 2010 14:15:02 GMT
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: users-unsubscribe@felix.apache.org
> For additional commands, e-mail: users-help@felix.apache.org
> 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message