SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Maven & Ivy
    vs
  OSGi

           26 Mai 2011
            Toulouse Jug
         Nicolas Lalevée
Nicolas Lalevée
   développeur web depuis 2005

 Committeur Apache Ant/Ivy/IvyDE

Mentor 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/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}]
[...]
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 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
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"
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"
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
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 ?

Weitere ähnliche Inhalte

Was ist angesagt?

GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursHoracio Gonzalez
 
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8Aurelien Navarre
 
Alphorm.com Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com   Formation Scripting Bash avancé pour GNU/LinuxAlphorm.com   Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com Formation Scripting Bash avancé pour GNU/LinuxAlphorm
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express jsAbdoulaye Dieng
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSmartnSkilled
 
Support : introduction à docker
Support : introduction à dockerSupport : introduction à docker
Support : introduction à dockerBoubker ABERWAG
 
Introductions Aux Servlets
Introductions Aux ServletsIntroductions Aux Servlets
Introductions Aux ServletsFrançois Charoy
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Microbox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Royekino
 
Symfony with angular.pptx
Symfony with angular.pptxSymfony with angular.pptx
Symfony with angular.pptxEsokia
 
les servlets-java EE
les  servlets-java EEles  servlets-java EE
les servlets-java EEYassine Badri
 
Formation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFFormation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFBoubker ABERWAG
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Olivier Gutknecht
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 

Was ist angesagt? (20)

Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Jsp
JspJsp
Jsp
 
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - CoursENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
ENIB cours CAI Web - Séance 4 - Frameworks/Spring - Cours
 
APACHE HTTP
APACHE HTTPAPACHE HTTP
APACHE HTTP
 
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
DrupalCamp Nantes 2016 - Migrer un site Drupal 6 ou Drupal 7 vers Drupal 8
 
Alphorm.com Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com   Formation Scripting Bash avancé pour GNU/LinuxAlphorm.com   Formation Scripting Bash avancé pour GNU/Linux
Alphorm.com Formation Scripting Bash avancé pour GNU/Linux
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
 
Support : introduction à docker
Support : introduction à dockerSupport : introduction à docker
Support : introduction à docker
 
Introductions Aux Servlets
Introductions Aux ServletsIntroductions Aux Servlets
Introductions Aux Servlets
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Microbox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Roy
 
Symfony with angular.pptx
Symfony with angular.pptxSymfony with angular.pptx
Symfony with angular.pptx
 
les servlets-java EE
les  servlets-java EEles  servlets-java EE
les servlets-java EE
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
Formation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFFormation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPF
 
Présentation1
Présentation1Présentation1
Présentation1
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 

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

20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natifHenri Gomez
 
20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natif20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natifHenri Gomez
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueRossi Oddet
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Jérôme Petazzoni
 
Play Framework
Play FrameworkPlay Framework
Play FrameworkArmaklan
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logiciellejollivetc
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Joël Séguillon
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 

Ähnlich wie Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011) (20)

20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif20120110 paris jug-packaging-natif
20120110 paris jug-packaging-natif
 
20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natif20111220 lyon jug-packaging-natif
20111220 lyon jug-packaging-natif
 
Gradle_NormandyJUG
Gradle_NormandyJUGGradle_NormandyJUG
Gradle_NormandyJUG
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)
 
Gradle_ToulouseJUG
Gradle_ToulouseJUGGradle_ToulouseJUG
Gradle_ToulouseJUG
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logicielle
 
gradle_nantesjug
gradle_nantesjuggradle_nantesjug
gradle_nantesjug
 
Maven
MavenMaven
Maven
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Gradle_ToursJUG
Gradle_ToursJUGGradle_ToursJUG
Gradle_ToursJUG
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
 
Octo Maven.pdf
Octo Maven.pdfOcto Maven.pdf
Octo Maven.pdf
 
OpenNMS
OpenNMSOpenNMS
OpenNMS
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 

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»
  • 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
  • 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
  • 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

Hinweis der Redaktion

  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