• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
 

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

on

  • 3,505 views

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....

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.

Statistics

Views

Total Views
3,505
Views on SlideShare
2,187
Embed Views
1,318

Actions

Likes
0
Downloads
28
Comments
0

8 Embeds 1,318

http://toulousejug.org 1257
http://www.kanithael.net 50
url_unknown 4
http://toulousejug.github.io 3
http://www.slideshare.net 1
http://webcache.googleusercontent.com 1
http://localhost 1
http://www.bodul.fr 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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) Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011) Presentation Transcript

  • 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• Projet «multi modules», oui mais en fait non.
  • • 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</packaging> <name>Jenkins core</name> <build>...</build> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> ... </dependencies> ...</project>
  • $ 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}][...]
  • 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]---------------------------------------------------------------
  • 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
  • Maven : scope<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.3.1</version> <scope>test</scope></dependency>• <scope> : compile, provided, runtime, test, system
  • 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
  • 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>
  • 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)
  • • 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 être très verbeux dans les logs• Bonne intégration à Ant (et Eclipse !)• Compatibilité avec les repo Maven
  • 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>
  • 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>
  • 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>
  • 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>
  • 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
  • OSGi• Open Services Gateway initiative• première release de la spec en 2000• Eclipse adopte OSGi R4 en 2005• R4.2 en Octobre 2009
  • 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 gestion de version ?
  • D’autres ?• .deb (debian et ubuntu)• .rpm (redhat)• ebuild (gentoo)• ports (freebsd et macport) Sans gestion de version ?• cibles make et targets Ant
  • 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
  • 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
  • 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
  • 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 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
  • 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"
  • 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"
  • 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
  • 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»
  • 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.»
  • 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
  • Problème de transitivité• Dépendances: • monprojet -> malib, logback • malib -> log4j• Classpath résultant: • malib.jar; monprojet.jar;log4j.jar;logback.jar
  • Problème de transitivité• Ce qu’il faudrait : • malib.jar • monprojet.jar • logback.jar • log4j-over-slf4j.jar • slf4j-api.jar
  • Problème de transitivité• Solution: • malib -> log4j • monprojet -> malib (exclude log4j), slf4j (log4j- over-slf4j), logback
  • 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
  • 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
  • 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 MANIFEST.MF• Publication sur un OBR, sans ivy.xml
  • WDYT ?