Maven & Ivy    vs  OSGi           26 Mai 2011            Toulouse Jug         Nicolas Lalevée
Nicolas Lalevée   développeur web depuis 2005 Committeur Apache Ant/Ivy/IvyDEMentor d’Apache Easyant (Incubating)
Agenda• Maven• Ivy• OSGi• Comparons
Le répertoire lib• Répertoire rempli de machin.jar• Téléchargement un à un• Itération jusqu’à ce que cela compile/démarre•...
• première release en 2003• 2.0 en 2005• 3.0 en Octobre 2010
Maven :      fonctionnalités• Build• Gestion de dépendances• Repository de jars• Architecture plugin : Mojos
Maven : pom.xml<project> <groupId>org.jenkins-ci.main</groupId> <artifactId>jenkins-core</artifactId> <packaging>jar</pack...
$ mvn clean installMaven : run[INFO] Scanning for projects...[INFO]-------------------------------------------------------...
TESTS           Maven : run-----------------------------------------------------------------------------------------------...
Maven :          dépendances<project> <groupId>org.jenkins-ci.main</groupId> <artifactId>jenkins-core</artifactId> <depend...
Maven : scope<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.3.1</version> <scope>test</sc...
Maven : optional<dependency> <groupId>org.apache</groupId> <artifactId>lucene</artifactId> <version>3.1</version> <optiona...
Maven : exclusions<dependency> <groupId>commons-jelly</groupId> <artifactId>commons-jelly-tags-xml</artifactId> <version>1...
Modèle Maven• identifiant : organisation + nom + version• mono artefact• dépendances d’usage interne (scope=runtime,  compi...
• première release en 2006 chez Jayasoft• Entrée dans Apache en 2007• 2.2 en Octobre 2010
Ivy : fonctionnalités• Pas de build, juste de la gestion de dépendances• Configurable à souhait• Bonne documentation• Peut ...
ivysettings.xml• Pas d’ivysettings = Maven repo<ivysettings>  <settings defaultResolver="myrepo-chain" />  <property name=...
Ivy : ivy.xml<ivy-module version="2.0"> <info organisation="org.slf4j" module="slf4j" revision="1.6.1" /> <configurations> ...
Ivy : dépendances              internes<ivy-module version="2.0"> <info organisation="com.acme" module="myapp" revision="1...
Ivy : réglages fins<ivy-module version="2.0"> <info organisation="com.acme" module="myapp" revision="1.0" /> <dependencies>...
Modèle Ivy• identifiant : organisation + name + (branch) +  revision + (métadonnée)• multi artefacts• dépendances d’usage i...
OSGi• Open Services Gateway initiative• première release de la spec en 2000• Eclipse adopte OSGi R4 en 2005• R4.2 en Octob...
OSGi, c’est...• «module system and service platform for the JVM»
D’autres ?
D’autres ?•   .deb (debian et ubuntu)•   .rpm (redhat)•   ebuild (gentoo)•   ports (freebsd et macport)
D’autres ?•   .deb (debian et ubuntu)•   .rpm (redhat)•   ebuild (gentoo)•   ports (freebsd et macport)             Sans g...
D’autres ?•   .deb (debian et ubuntu)•   .rpm (redhat)•   ebuild (gentoo)•   ports (freebsd et macport)             Sans g...
D’autres ?•   .deb (debian et ubuntu)•   .rpm (redhat)•   ebuild (gentoo)•   ports (freebsd et macport)             Sans g...
D’autres ?•   .deb (debian et ubuntu)•   .rpm (redhat)•   ebuild (gentoo)•   ports (freebsd et macport)             Sans g...
D’autres ?•   .deb (debian et ubuntu)•   .rpm (redhat)•   ebuild (gentoo)•   ports (freebsd et macport)             Sans g...
Classloaders• «Charge» les classes Java
Classloaders• «Charge» les classes Java• «Cherche et trouve» les classes Java
Classloaders• «Charge» les classes Java• «Cherche et trouve» les classes Java• «Résout» les imports d’une classe Java
import++
import++• agrégation au niveau package
import++• agrégation au niveau package• notion de version de package
import++• agrégation au niveau package• notion de version de package• notion de version de jar
OSGi bundlesorg.apache.ivyde                                                                    org.apache.ivy          or...
MANIFEST.MFManifest-Version: 1.0Main-Class: org.apache.ivy.MainBundle-ManifestVersion: 2Bundle-SymbolicName: org.apache.iv...
attribut «use»Import-Package: com.jcraft.jsch;resolution:=optional, org.apache.ant;resolution:=optional, org.apache.common...
Require-BundleManifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: Apache IvyDEBundle-SymbolicName: org.apache.ivyde...
Modèle OSGi• identifiant : nom symbolique + version• mono artefact (même pas de source, javadoc)• dépendances d’usage exter...
OBR• OSGi Bundle Repository (RFC 112 / RFP 122)• Spécification d’une API Java opérant sur un  repository de bundles• «SHALL...
Comparaison      Ivy/Maven                   OSGi• générique                  • java only• Implémentation             • AP...
Problème de          transitivité• Dépendances:   • monprojet -> malib, logback   • malib -> log4j• Classpath résultant:  ...
Problème de          transitivité• Ce qu’il faudrait :  • malib.jar  • monprojet.jar  • logback.jar  • log4j-over-slf4j.ja...
Problème de         transitivité• Solution:  • malib -> log4j  • monprojet -> malib (exclude log4j), slf4j (log4j-     ove...
Problème de          transitivité• Dépendances (API):   • malib -> org.apache.log4j   • monprojet -> com.acme.malib, ch.qo...
Mergeons ?      Ivy/Maven                   OSGi• générique                  • java only• Implémentation             • API...
2 vues• Vue provider : déclare des dépendances d’un API• Vue développeur : besoin d’une certaine  implémentation d’une API
2 descripteurs ?• descripteur des dépendances au niveau API• descripteur des implémentations à réellement utiliser
Proposition• ivy.xml lors du développement (usages internes)• résolution de dépendances via un OBR• bnd pour générer le MA...
WDYT ?
Upcoming SlideShare
Loading in …5
×

Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)

3,388
-1

Published on

Présentation par Nicolas Lalevée des modèles de gestion de dépendances Maven, Ivy et OSGi au Toulouse Jug du 26 Mai 2011.

Abstract:
La gestion des dépendances, sac de noeuds presque par définition, on va essayer de démêler tout ça.
Après avoir fait un état des lieux avec Maven car il est l'incontournable du moment, nous irons voir comment Ivy peut décrire assez finement et gérer avec souplesse des dépendances. Nous verrons ensuite comment le modèle de dépendances d'OSGi est original et apporte encore de nouveaux concepts. Deux mondes s'affrontent alors, celui de Maven et Ivy face à celui d'OSGi; on tentera enfin d'esquisser un meilleur des deux mondes.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,388
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
30
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)

    1. 1. Maven & Ivy vs OSGi 26 Mai 2011 Toulouse Jug Nicolas Lalevée
    2. 2. Nicolas Lalevée développeur web depuis 2005 Committeur Apache Ant/Ivy/IvyDEMentor d’Apache Easyant (Incubating)
    3. 3. Agenda• Maven• Ivy• OSGi• Comparons
    4. 4. Le répertoire lib• Répertoire rempli de machin.jar• Téléchargement un à un• Itération jusqu’à ce que cela compile/démarre• Projet «multi modules», oui mais en fait non.
    5. 5. • première release en 2003• 2.0 en 2005• 3.0 en Octobre 2010
    6. 6. Maven : fonctionnalités• Build• Gestion de dépendances• Repository de jars• Architecture plugin : Mojos
    7. 7. Maven : pom.xml<project> <groupId>org.jenkins-ci.main</groupId> <artifactId>jenkins-core</artifactId> <packaging>jar</packaging> <name>Jenkins core</name> <build>...</build> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> ... </dependencies> ...</project>
    8. 8. $ mvn clean installMaven : run[INFO] Scanning for projects...[INFO]------------------------------------------------------------------------[INFO] Building Jenkins core[INFO] task-segment: [clean, install][INFO]------------------------------------------------------------------------[INFO] [clean:clean {execution: default-clean}][INFO] Deleting directory /home/me/jenkins/core/targetDownloading: http://maven.glassfish.org/content/groups/public//commons-lang/commons-lang/2.4/commons-lang-2.4.pom13K downloaded (commons-lang-2.4.pom)Downloading: http://maven.glassfish.org/content/groups/public//commons-lang/commons-lang/2.4/commons-lang-2.4.jar255K downloaded (commons-lang-2.4.jar)[...][INFO] [stapler:apt-compile {execution: default-apt-compile}][INFO] Compiling 717 source files to /home/me/jenkins/core/target/classes[INFO] [encoding:check-encoding {execution: default}][...]
    9. 9. TESTS Maven : run--------------------------------------------------------------------------------------------------------------Running hudson.BulkChangeTest[...][INFO] [jar:jar {execution: default-jar}][INFO] Building jar: /home/me/jenkins/core/target/jenkins-core-1.397-SNAPSHOT.jar[INFO] [install:install {execution: default-install}][INFO] Installing /home/me/jenkins/core/target/jenkins-core-1.397-SNAPSHOT.jar to /home/me/.m2/repository/org/jenkins-ci/main/jenkins-core/1.397-SNAPSHOT/jenkins-core-1.397-SNAPSHOT.jar[INFO]------------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO]------------------------------------------------------------------------[INFO] Total time: 36 seconds[INFO] Finished at: Sun Feb 06 18:30:34 CET 2011[INFO] Final Memory: 62M/121M[INFO]---------------------------------------------------------------
    10. 10. Maven : dépendances<project> <groupId>org.jenkins-ci.main</groupId> <artifactId>jenkins-core</artifactId> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> • version : «The default Maven meaning for 1.0 is everything (,) but with 1.0 recommended» • (,1.0],[1.2,) <=> x <= 1.0 or x >= 1.2
    11. 11. Maven : scope<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.3.1</version> <scope>test</scope></dependency>• <scope> : compile, provided, runtime, test, system
    12. 12. Maven : optional<dependency> <groupId>org.apache</groupId> <artifactId>lucene</artifactId> <version>3.1</version> <optional>true</optional></dependency>• peut éviter de télécharger the world• peu utile à l’utilisateur
    13. 13. Maven : exclusions<dependency> <groupId>commons-jelly</groupId> <artifactId>commons-jelly-tags-xml</artifactId> <version>1.1</version> <exclusions> <exclusion> <groupId>commons-jelly</groupId> <artifactId>commons-jelly</artifactId> </exclusion> <exclusions></dependency>
    14. 14. Modèle Maven• identifiant : organisation + nom + version• mono artefact• dépendances d’usage interne (scope=runtime, compile, test)• notion d’usage externe limité (optional=true)• notion de runtime (scope=provided, system)
    15. 15. • première release en 2006 chez Jayasoft• Entrée dans Apache en 2007• 2.2 en Octobre 2010
    16. 16. Ivy : fonctionnalités• Pas de build, juste de la gestion de dépendances• Configurable à souhait• Bonne documentation• Peut être très verbeux dans les logs• Bonne intégration à Ant (et Eclipse !)• Compatibilité avec les repo Maven
    17. 17. ivysettings.xml• Pas d’ivysettings = Maven repo<ivysettings> <settings defaultResolver="myrepo-chain" /> <property name="ivypattern" value="[organisation]/[module]/[revision]/ivy.xml" /> <property name="artpattern" value="[organisation]/[module]/[revision]/[type]s/[artifact]-[revision].[ext]" /> <caches useOrigin="true"> <cache name="myrepo-cache" basedir="/myrepocache" /> </caches> <resolvers> <filesystem name="myrepo-local" cache="myrepo-cache"> <ivy pattern="/myrepo/${ivypattern}" /> <artifact pattern="/myrepo/${artpattern}" /> </filesystem> <url name="myrepo-http" cache="myrepo-cache"> <ivy pattern="http://myrepo/${ivypattern}" /> <artifact pattern="http://myrepo/${artpattern}" /> </url> <chain name="myrepo-chain" returnFirst="true"> <resolver ref="myrepo-local" /> <resolver ref="myrepo-http" /> </chain> </resolvers></ivysettings>
    18. 18. Ivy : ivy.xml<ivy-module version="2.0"> <info organisation="org.slf4j" module="slf4j" revision="1.6.1" /> <configurations> <conf name="default" extends="simple" /> <conf name="api"/> <conf name="log4j" extends="api" /> <conf name="jcl" extends="api" /> <conf name="simple" extends="api" /> <conf name="nop" extends="api" /> <conf name="jdk14" extends="api" /> ... </configurations> <publications> <artifact name="slf4j-api" type="jar" ext="jar" conf="api" /> <artifact name="slf4j-api" type="source" ext="jar" conf="api" /> <artifact name="slf4j-log4j" type="jar" ext="jar" conf="log4j" /> <artifact name="slf4j-log4j" type="source" ext="jar" conf="log4j" /> ... </publications> <dependencies> <dependency org="org.apache.log4j" name="log4j" rev="1.2.15" conf="log4j->default" /> <dependency org="org.apache.commons" name="commons-logging" rev="1.1.1"conf="jcl->default" /> </dependencies></ivy.xml>
    19. 19. Ivy : dépendances internes<ivy-module version="2.0"> <info organisation="com.acme" module="myapp" revision="1.0" /> <configurations> <conf name="compile" visibility="private" /> <conf name="runtime" visibility="private" /> <conf name="test" visibility="private" extends="compile,runtime" /> </configurations> <publications> <artifact name="myapp" type="jar" ext="jar" /> <artifact name="myapp" type="source" ext="jar" /> </publications> <dependencies> <dependency org="org.junit" name="junit" rev="4.1" conf="test->default" /> <dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="compile->default" /> <dependency org="org.slf4j" name="slf4j" rev="1.6.1" conf="compile->api;runtime->log4j;test->simple" /> </dependencies></ivy.xml>
    20. 20. Ivy : réglages fins<ivy-module version="2.0"> <info organisation="com.acme" module="myapp" revision="1.0" /> <dependencies> <dependency org="commons-jelly" name="commons-jelly-tags-xml" rev="1.1"> <exclude org="commons-jelly" module="commons-jelly" artifact="jelly" type="jar" ext="jar" /> </dependency> <dependency org="commons-lang" name="commons-lang" rev="1.1" transitive="false"> <artifact name="commons-lang" type="jar" conf="runtime" /> </dependency> <dependency org="commons-logging" name="commons-logging" rev="1.1" conf="runtime,test->default"> <include name="commons-logging" type="jar" conf="runtime" /> <include name="commons-logging" type="source" conf="test" /> </dependency> </dependencies></ivy.xml>
    21. 21. Modèle Ivy• identifiant : organisation + name + (branch) + revision + (métadonnée)• multi artefacts• dépendances d’usage interne (conf visibility=private)• dépendances d’usage externe (conf visibility=public)• pas de notion de runtime/provided
    22. 22. OSGi• Open Services Gateway initiative• première release de la spec en 2000• Eclipse adopte OSGi R4 en 2005• R4.2 en Octobre 2009
    23. 23. OSGi, c’est...• «module system and service platform for the JVM»
    24. 24. D’autres ?
    25. 25. D’autres ?• .deb (debian et ubuntu)• .rpm (redhat)• ebuild (gentoo)• ports (freebsd et macport)
    26. 26. D’autres ?• .deb (debian et ubuntu)• .rpm (redhat)• ebuild (gentoo)• ports (freebsd et macport) Sans gestion de version ?
    27. 27. D’autres ?• .deb (debian et ubuntu)• .rpm (redhat)• ebuild (gentoo)• ports (freebsd et macport) Sans gestion de version ?• cibles make et targets Ant
    28. 28. D’autres ?• .deb (debian et ubuntu)• .rpm (redhat)• ebuild (gentoo)• ports (freebsd et macport) Sans gestion de version ?• cibles make et targets Ant• «include» en C, XSLT, make, Ant
    29. 29. D’autres ?• .deb (debian et ubuntu)• .rpm (redhat)• ebuild (gentoo)• ports (freebsd et macport) Sans gestion de version ?• cibles make et targets Ant• «include» en C, XSLT, make, Ant• diagramme de gantt
    30. 30. D’autres ?• .deb (debian et ubuntu)• .rpm (redhat)• ebuild (gentoo)• ports (freebsd et macport) Sans gestion de version ?• cibles make et targets Ant• «include» en C, XSLT, make, Ant• diagramme de gantt• java: import
    31. 31. Classloaders• «Charge» les classes Java
    32. 32. Classloaders• «Charge» les classes Java• «Cherche et trouve» les classes Java
    33. 33. Classloaders• «Charge» les classes Java• «Cherche et trouve» les classes Java• «Résout» les imports d’une classe Java
    34. 34. import++
    35. 35. import++• agrégation au niveau package
    36. 36. import++• agrégation au niveau package• notion de version de package
    37. 37. import++• agrégation au niveau package• notion de version de package• notion de version de jar
    38. 38. OSGi bundlesorg.apache.ivyde org.apache.ivy org.apache.ivy org.apache.ivy.resolver org.apache.ivy org.eclipse.jdt org.apache.ivy.resolver org.eclipse.ui org.apache.ivy.ant org.eclipse.jdt org.eclipse.jdt org.eclipse.core org.eclipse.core org.eclipse.ui org.eclipse.core org.eclipse.ui org.eclipse.core
    39. 39. MANIFEST.MFManifest-Version: 1.0Main-Class: org.apache.ivy.MainBundle-ManifestVersion: 2Bundle-SymbolicName: org.apache.ivyBundle-Version: 2.3.0Bundle-Name: Apache IvyBundle-Vendor: Apache Software FoundationBundle-DocURL: http://ant.apache.org/ivy/Import-Package: com.jcraft.jsch;resolution:=optional, javax.swing;resolution:=optional, javax.xml.parsers, org.apache.ant;version="1.8.0";resolution:=optional, org.apache.commons.httpclient;resolution:=optional, org.apache.commons.vfs;resolution:=optional, org.apache.oro.text;resolution:=optionalExport-Package: org.apache.ivy;version="2.0.0", org.apache.ivy.ant;version="2.0.0", org.apache.ivy.core;version="2.0.0", org.apache.ivy.core.cache;version="2.0.0"
    40. 40. attribut «use»Import-Package: com.jcraft.jsch;resolution:=optional, org.apache.ant;resolution:=optional, org.apache.commons.httpclient;resolution:=optional, org.apache.commons.vfs;resolution:=optional, org.apache.oro.text;resolution:=optionalExport-Package: org.apache.ivy;version="2.0.0", org.apache.ivy.ant;version="2.0.0";use:=org.apache.ant, org.apache.ivy.core;version="2.0.0", org.apache.ivy.core.cache;version="2.0.0"
    41. 41. Require-BundleManifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: Apache IvyDEBundle-SymbolicName: org.apache.ivyde.eclipse; singleton:=trueBundle-Version: 2.2.0.qualifierRequire-Bundle: org.apache.xerces;bundle- version="[2.9.0,3.0.0)";resolution:=optional, org.eclipse.ui;bundle-version="[3.4.0,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)", org.eclipse.jdt.core;bundle-version="[3.4.0,4.0.0)", org.eclipse.jdt.ui;bundle-version="[3.4.0,4.0.0)", org.eclipse.ui.console;bundle-version="[3.4.0,4.0.0)", org.apache.ivy;bundle-version="[2.1.0,3.0.0)", org.eclipse.debug.core;bundle-version="[3.4.0,4.0.0)", org.eclipse.core.variables;bundle-version="[3.2.0,4.0.0)"Bundle-RequiredExecutionEnvironment: J2SE-1.4
    42. 42. Modèle OSGi• identifiant : nom symbolique + version• mono artefact (même pas de source, javadoc)• dépendances d’usage externes• pas de notion d’usage interne (test/runtime/compile)• pas de notion de «provided»
    43. 43. OBR• OSGi Bundle Repository (RFC 112 / RFP 122)• Spécification d’une API Java opérant sur un repository de bundles• «SHALL NOT be required to produce identical sets of resolved resources throughout every phase of the development process.»
    44. 44. Comparaison Ivy/Maven OSGi• générique • java only• Implémentation • API (Implémentation)• usage interne & externe • usage externe• résolution reproductible • résolution fluctuante
    45. 45. Problème de transitivité• Dépendances: • monprojet -> malib, logback • malib -> log4j• Classpath résultant: • malib.jar; monprojet.jar;log4j.jar;logback.jar
    46. 46. Problème de transitivité• Ce qu’il faudrait : • malib.jar • monprojet.jar • logback.jar • log4j-over-slf4j.jar • slf4j-api.jar
    47. 47. Problème de transitivité• Solution: • malib -> log4j • monprojet -> malib (exclude log4j), slf4j (log4j- over-slf4j), logback
    48. 48. Problème de transitivité• Dépendances (API): • malib -> org.apache.log4j • monprojet -> com.acme.malib, ch.qos.logback• Résolution: • com.acme.malib; org.apache.log4j; ch.qos.logback• choix des implémentations: malib, log4j-over-slf4j, logback
    49. 49. Mergeons ? Ivy/Maven OSGi• générique • java only• Implémentation • API (Implémentation)• usage interne & externe • usage externe• résolution reproductible • résolution fluctuante
    50. 50. 2 vues• Vue provider : déclare des dépendances d’un API• Vue développeur : besoin d’une certaine implémentation d’une API
    51. 51. 2 descripteurs ?• descripteur des dépendances au niveau API• descripteur des implémentations à réellement utiliser
    52. 52. Proposition• ivy.xml lors du développement (usages internes)• résolution de dépendances via un OBR• bnd pour générer le MANIFEST.MF• Publication sur un OBR, sans ivy.xml
    53. 53. WDYT ?
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×