Dieses Blog durchsuchen

Wird geladen...

Donnerstag, 10. Februar 2011

Maven: Optionale Abhängigkeiten und der Dependency Import Scope

Ich habe mich immer nach dem Sinn des Maven Import-Scope gefragt. Jetzt habe ich einen konkreten sinnvollen Anwendungsfall gefunden.

Wenn in einem Maven-Projekt eine benutzte externe Bibliothek eine optionale Abhängigkeit definiert, dann muss diese optionale Abhängigkeit auch in meinem Projekt als reale Abhängigkeit definiert werden.

Beispiel: Wenn in einem Projekt Hibernate verwendet wird, ist die Entscheidung zu treffen, welche Bytecode Manipulation Bibliothek verwendet werden soll. Hier definiert Hibernate die Bibliotheken Javassist und Cglib als optionale Abhängigkeiten in Modul hibertnate-core. Dabei ist die Versionsnummer von Javassist bzw. Cglib im Modul hibernate-parent definiert.

Soll nun Hibernate zusammen mit Javassist benutzt werden, ist Javassist als direkte Abhängigkeit ins eigene Projekt aufzunehmen.

<project>

 <dependencies>
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>3.6.1.Final</version>
  </dependency>

  <dependency>
   <groupId>javassist</groupId>
   <artifactId>javassist</artifactId>
   <version>3.12.0.GA</version>
  </dependency>
 </dependencies>

</project>

Dabei fällt auf das die Versionsnummer von Javassist mit angeben werden muss. Ein Problem ergibt sich nun bei einem Wechsel der Hibernate Version, man muss aufpassen die gleiche Javassist Version zu benutzen wie sie in hibernate-parent definiert ist (bei Hibernate 3.5 kommt Javassist in Version 3.9.0 zum Einsatz, bei Hibernate 3.6 wurde auf Javassist 3.12.0 gewechselt).

Hier kommt nun der Import-Scope zum Einsatz.

<project>

 <dependencyManagement>
  <dependencies>
   <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-parent</artifactId>
    <version>3.6.1.Final</version>
    <type>pom</type>
    <scope>import</scope>
   </dependency>
  </dependencies>
 </dependencyManagement>

 <dependencies>
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>3.6.1.Final</version>
  </dependency>

  <dependency>
   <groupId>javassist</groupId>
   <artifactId>javassist</artifactId>
  </dependency>
 </dependencies>

</project>

Bei der Angabe des Import-Scope werden alle "gemanagten" Abhänigkeiten eines Artefakts in das Projekt importiert, so dass diese im eigenen Projekt zur Verfügung stehen.

Wie im Beispiel zu sehen ist, ist Javassist als Abhängigkeit ohne Versionsnummer angegeben. Die Versionskennung für Javassist wird durch das Importieren der Abhängigkeiten aus Modul hibernate-parent aufgelöst.

Das Beispiel kann über github.com/kreyssel geladen werden.

Keine Kommentare:

Kommentar veröffentlichen