Publicité
Publicité

Contenu connexe

Publicité

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

  1. Maven & Ivy vs OSGi 26 Mai 2011 Toulouse Jug Nicolas Lalevée
  2. Nicolas Lalevée développeur web depuis 2005 Committeur Apache Ant/Ivy/IvyDE Mentor d’Apache Easyant (Incubating)
  3. Agenda • Maven • Ivy • OSGi • Comparons
  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. • première release en 2003 • 2.0 en 2005 • 3.0 en Octobre 2010
  6. Maven : fonctionnalités • Build • Gestion de dépendances • Repository de jars • Architecture plugin : Mojos
  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. $ 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/target Downloading: http://maven.glassfish.org/content/groups/public// commons-lang/commons-lang/2.4/commons-lang-2.4.pom 13K downloaded (commons-lang-2.4.pom) Downloading: http://maven.glassfish.org/content/groups/public// commons-lang/commons-lang/2.4/commons-lang-2.4.jar 255K 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. 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. 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. 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. 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. 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. 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. • première release en 2006 chez Jayasoft • Entrée dans Apache en 2007 • 2.2 en Octobre 2010
  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. 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. 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. 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. 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. 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. 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. OSGi, c’est... • «module system and service platform for the JVM»
  24. D’autres ?
  25. D’autres ? • .deb (debian et ubuntu) • .rpm (redhat) • ebuild (gentoo) • ports (freebsd et macport)
  26. D’autres ? • .deb (debian et ubuntu) • .rpm (redhat) • ebuild (gentoo) • ports (freebsd et macport) Sans gestion de version ?
  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. 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. 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. 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. Classloaders • «Charge» les classes Java
  32. Classloaders • «Charge» les classes Java • «Cherche et trouve» les classes Java
  33. Classloaders • «Charge» les classes Java • «Cherche et trouve» les classes Java • «Résout» les imports d’une classe Java
  34. import++
  35. import++ • agrégation au niveau package
  36. import++ • agrégation au niveau package • notion de version de package
  37. import++ • agrégation au niveau package • notion de version de package • notion de version de jar
  38. OSGi bundles org.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. MANIFEST.MF Manifest-Version: 1.0 Main-Class: org.apache.ivy.Main Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.apache.ivy Bundle-Version: 2.3.0 Bundle-Name: Apache Ivy Bundle-Vendor: Apache Software Foundation Bundle-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:=optional Export-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. 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:=optional Export-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. Require-Bundle Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Apache IvyDE Bundle-SymbolicName: org.apache.ivyde.eclipse; singleton:=true Bundle-Version: 2.2.0.qualifier Require-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. 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. 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. 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. Problème de transitivité • Dépendances: • monprojet -> malib, logback • malib -> log4j • Classpath résultant: • malib.jar; monprojet.jar;log4j.jar;logback.jar
  46. Problème de transitivité • Ce qu’il faudrait : • malib.jar • monprojet.jar • logback.jar • log4j-over-slf4j.jar • slf4j-api.jar
  47. Problème de transitivité • Solution: • malib -> log4j • monprojet -> malib (exclude log4j), slf4j (log4j- over-slf4j), logback
  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. 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. 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. 2 descripteurs ? • descripteur des dépendances au niveau API • descripteur des implémentations à réellement utiliser
  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. WDYT ?

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n\n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
Publicité