2009-05-03 9 views
25

Mein Projekt enthält eine JAR-Datei, da sie als transitive Abhängigkeit aufgeführt ist.Maven: Entfernen einer einzelnen transitiven Abhängigkeit

Allerdings habe ich nicht nur verifiziert, dass ich es nicht brauche, aber es verursacht Probleme, weil eine Klasse innerhalb der JAR-Dateien eine Klasse schattiert, die ich in einer anderen JAR-Datei brauche.

Wie lasse ich eine einzige JAR-Datei aus meinen transitiven Abhängigkeiten aus?

Antwort

30

Sie eine Abhängigkeit in der folgenden Weise ausschließen:

 <dependency> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring</artifactId> 
       <version>2.5.6</version> 
       <exclusions> 
         <exclusion> 
           <groupId>commons-logging</groupId> 
           <artifactId>commons-logging</artifactId> 
         </exclusion> 
       </exclusions> 
     </dependency> 
3

Sie können dies tun, indem Sie das problematische Artefakt explizit ausschließen. Nehmen Sie die Abhängigkeit, die das Problem und markieren es enthält ausgeschlossen werden:

Vom Maven website:

<dependency> 
    <groupId>group-a</groupId> 
    <artifactId>artifact-a</artifactId> 
    <version>1.0</version> 
    <exclusions> 
    <exclusion> 
     <groupId>group-c</groupId> 
     <artifactId>excluded-artifact</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
15

Der richtige Weg ist, den Ausschließungsmechanismus zu verwenden, aber manchmal möchten Sie vielleicht lieber den folgenden Hack verwenden, um das Hinzufügen einer großen Anzahl von Ausschlüssen zu vermeiden, wenn viele Artefakte dieselbe transitive Abhängigkeit haben, die Sie ignorieren möchten. Anstatt einen Ausschluss anzugeben, definieren Sie eine zusätzliche Abhängigkeit mit dem Umfang "bereitgestellt". Dies teilt Maven mit, dass Sie dieses Artefakt zur Laufzeit manuell bereitstellen werden und es daher nicht gepackt wird. Zum Beispiel:

<dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring</artifactId> 
      <version>2.5.6</version> 
    </dependency> 
    <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
      <scope>provided</scope> 
    </dependency> 

Nebeneffekt: Sie müssen eine Version des angeben Artefakt-zu-sein-ignoriert und seine POM wird zur Buildzeit abgerufen werden; Dies ist bei regulären Ausschlüssen nicht der Fall. Dies könnte ein Problem für Sie sein, wenn Sie Ihr privates Maven-Repository hinter einer Firewall ausführen.

+0

Ich habe versucht, Servlet-API aus einer Jar Abhängigkeit durch die Ole Methode auszuschließen und das hat nicht funktioniert für mich, aber versuchte diese Methode und es hat den Trick. Vielen Dank. – Aaron

+0

das funktionierte für mich, als ich eine Abhängigkeit basierend auf einem ausschließen musste. Vielen Dank! –

+0

Sie könnten auch den Geltungsbereich _system_ verwenden, wenn Ihre Abhängigkeit in der JRE enthalten ist. Zum Beispiel mit jaxb-api 2.0 und JRE 6. Siehe [Maven Systemabhängigkeiten] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies) –

Verwandte Themen