2016-05-06 12 views
2

Was ich versuche zur Zeit ist:Wie kann ich nur eine transitive Abhängigkeit in meinem Maven-Projekt verbieten?

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
      <id>enforce-banned-dependencies</id> 
      <goals> 
       <goal>enforce</goal> 
      </goals> 
      <configuration> 
       <rules> 
        <banTransitiveDependencies> 
         <excludes> 
          <exclude>*:*:*</exclude> 
         </excludes> 
         <includes> 
          <include>commons-lang:commons-lang:2.4</include> 
         </includes> 
        </banTransitiveDependencies> 
       </rules> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Meine Absicht mit dem, was ich versuche, oben ist:

Ausschließen aller transitiven Abhängigkeiten zu verbieten, außer commons-lang: 2,4

Wenn Ich versuche

mvn verify 

werde ich ge t

[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-banned-dependencies) @ ebtam-core --- 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 

was nicht gut ist. Weil ich weiß, dass ich die folgende Abhängigkeit in meinem Projekt habe:

[INFO] +- org.apache.velocity:velocity:jar:1.6.2:compile 
[INFO] | +- commons-lang:commons-lang:jar:2.4:compile 

Was mache ich falsch?

+0

Ich kann nicht sicher sagen, (weshalb dieser Kommentar ist, keine Antwort), aber ist es nicht umgekehrt? Sie möchten commons-lang von der ban-Regel ausschließen, aber erzwingen, dass alles andere verboten ist. So ist Ihr *: *: * enthalten, und commons-lang: commons-lang: 2.4 ist ausgeschlossen. So habe ich es verstanden von https://maven.apache.org/enforcer/enforcer-rules/banTransitiveDependencies.html – Creperum

+0

@Creperum Nein, ich möchte alles ausschließen, einschließlich commons-lang. –

+0

Wenn Sie die commons-lang-Abhängigkeit verbieten möchten, müssen Sie nur das Include definieren, wie Sie es bereits getan haben, aber Sie müssen die Excludes entfernen. – khmarbaise

Antwort

2

Ich sehe nicht, wo dies dokumentiert ist, aber das Problem ist, dass das aktuelle Build-Artefakt auch bei der Überprüfung der banTransitiveDependencies Regeln berücksichtigt wird. Dann, looking at the code, da dieses Artefakt ausgeschlossen ist, werden seine Abhängigkeiten nicht überprüft. Wenn Sie also * für das Ausschlussmuster angeben, entspricht das Hauptartefakt dem und der Rest der Includes-Regeln wird ignoriert. So würde folgende Arbeiten:

<rules> 
    <banTransitiveDependencies> 
     <excludes> 
      <exclude>commons-lang</exclude> 
     </excludes> 
     <includes> 
      <include>commons-lang:commons-lang:2.4</include> 
     </includes> 
    </banTransitiveDependencies> 
</rules> 

aber es beantwortet nicht Ihre Frage „Ausschließen aller transitive Abhängigkeiten zu verbieten, außer commons-lang: 2,4“.

Die Frage ist, warum verwenden Sie diese Regel an erster Stelle? Es wurde in MENFORCER-138 eingeführt und sein Ziel ist es, Entwickler zu zwingen, sich nicht auf transitive Abhängigkeiten zu verlassen, die geerbt werden, und ihre Deklaration im POM zu erzwingen.

Ihr Ziel ist hier, den Build fehlzuschlagen, wenn die Abhängigkeit commons-lang:commons-lang:2.4 im Klassenpfad ist. Daher sollten Sie die Regel bannedDependencies verwenden. Standardmäßig sucht es transitiv nach Abhängigkeiten. Im Folgenden wird das tun, was Sie wollen, das heißt Verbot nur commons-lang:commons-lang:2.4:

<rules> 
    <bannedDependencies> 
     <excludes> 
      <exclude>commons-lang:commons-lang:2.4</exclude> 
     </excludes> 
    </bannedDependencies> 
</rules> 
+0

Nun, ich habe die Situation etwas vereinfacht, aber danke, das hilft mir sehr. Ich werde versuchen, die Antwort zu akzeptieren, wenn es für mich funktioniert (ich glaube es wird). –

Verwandte Themen