OSGi versie properties als variabele gebruiken in maven

10 February 2012 15:38 Ton Swieb Algemeen

Maven versies en OSGi versies zijn niet 1 op 1 uitwisselbaar.
Het meest bekende voorbeeld hiervan is het SNAPSHOT versienummer. In maven is het de conventie dat een snapshot eindigt op -SNAPSHOT, bijvoorbeeld 1.0-SNAPSHOT. Officieel wordt alles dat eindigt op SNAPSHOT door maven als snapshot aangemerkt, maar sinds versie 3.0.2 wordt dit officieel afgeraden omdat de meeste 3rd party tooling daarvan in de war raken. Zie MNG-4957.

De maven snapshot versie is echter niet compatible met OSGi. OSGi accepteert het - niet in een versienummer. Normaal gesproken is dit geen probleem omdat de maven bundle plugin dit afhandelt. Deze plugin converteert, tijdens het maken van de OSGi bundel, het maven versienummer naar een OSGi compatible versienummer. 1.0-SNAPSHOT wordt dan bijvoorbeeld 1.0.SNAPSHOT.

Onhandiger wordt het als je het OSGi versienummmer als maven variabele, ${…}, in een configuratiebestand wilt gebruiken. Bijvoorbeeld in het geval van een consumer bundel en een producer bundel waarbij de consumer bundel een OSGi service gebruikt van een specifieke versie van de producer bundel. De POM van de consumer bundel zal dan een afhankelijkheid hebben naar de producer bundel, bijvoorbeeld:

< ?xml version="1.0" encoding="UTF-8"?>


  4.0.0
  consumer
  bundle
  2.0

  
    1.0-SNAPSHOT
  

  
    
      nl.finalist.osgi.test
      producer
      ${producerversion}
      provided
    
  
  ...
  

Indien bijvoorbeeld gebruikt gemaakt wordt van Spring DM voor de lookup in de OSGi registry dan zou dit als volgt geconfigureerd kunnen worden:

< ?xml version="1.0" encoding="UTF-8"?>

  

Het bundel versienummer willen we liever niet hardcoded opnemen in het Spring configuratiebestand, maar afhankelijk houden van properties in de maven build. Echter de enige maven variabele die we zouden kunnen gebruiken is ${producerVersion}, maar dat resulteert in 1.0-SNAPSHOT en heeft vervolgens als resultaat dat de lookup zal falen. Een pragmatische oplossing zou zijn om zelf een ${producerOsgiVersion} variabele te definiƫren en deze handmatig bij te werken, maar dit is foutgevoelig, vergt begeleidende documentatie en is slecht onderhoudbaar indien het aantal benodigde OSGi services toeneemt.

Na een zoektocht door de code van de maven bundel plugin stuitte ik op een niet gedocumenteerde feature welke dit automatisch mogelijk maakt.


  org.apache.felix
  maven-bundle-plugin
  
    
      Generate OSGi version properties
      
        cleanVersions
      
      initialize
      
        
          ${producerversion}
        
      
    
  

Door de cleanVersions goal tijdens de initialize fase uit te voeren is de variabele ${producerOsgiVersion} beschikbaar voordat de maven resources plugin de configuratiebestanden gaat filteren.
De SpringDM configuratie kan nu aangepast worden zodat deze niet meer afhankelijk is van hardcoded OSGi versies:

< ?xml version="1.0" encoding="UTF-8"?>

  

Be Sociable, Share!

Reageer


zeven − = 3

RSS feed for comments on this post · TrackBack URI