2016-02-17 18 views
6

Nel mio progetto ho una dipendenza openejb-core con scope provided. Tuttavia ha dipendenza transitiva di slf4j e il suo ambito è compile (vedi screenshot). Tutte le altre dipendenze transitive sono fornite come previsto.La dipendenza transitiva Maven ha scope scope quando la dipendenza ha fornito scope

Domanda: È un bug o mi manca qualcosa?

enter image description here

+0

è la stessa dipendenza introdotta anche in modo transitorio da un'altra dipendenza nella compilazione dell'ambito? –

+0

No. Proprio in questo uno –

+0

Bene, ha fornito l'ambito per il tuo progetto.Ma openejb-core avrebbe potuto dichiararlo con scope compile e questa è la ragione per cui potresti vederlo come compilato –

risposta

10

In un pom di esempio ho aggiunto:

<dependencies> 
    <dependency> 
     <groupId>org.apache.openejb</groupId> 
     <artifactId>openejb-core</artifactId> 
     <version>4.7.0</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

poi eseguire:

mvn dependency:tree -Dincludes=org.slf4j 

l'output è:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- 
[INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT 
[INFO] \- org.apache.openejb:openejb-core:jar:4.7.0:provided 
[INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.7:provided 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:provided 

Quindi, come potete vedere Mav it è coerente con il suo official documentation. Il problema dal tuo screenshot è probabilmente sul tuo IDE.

La tabella è il punto chiave su questo tema: enter image description here

Da esso, possiamo vedere che ciò che è transitivamente portata compile o runtime va nel campo di applicazione previsto, ciò che è di portata provided o test viene ignorato.

Tuttavia, se cambio pom campione:

<dependencies> 
    <dependency> 
     <groupId>org.apache.openejb</groupId> 
     <artifactId>openejb-core</artifactId> 
     <version>4.7.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.7</version> 
    </dependency> 
</dependencies> 

e rieseguire il comando dell'albero delle dipendenze, l'uscita è la seguente:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- 
[INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT 
[INFO] +- org.apache.openejb:openejb-core:jar:4.7.0:provided 
[INFO] | \- org.slf4j:slf4j-jdk14:jar:1.7.7:provided 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile 

guardare adesso: non viene come un figlio della dipendenza fornita, ma allo stesso livello.

Continuiamo.

Se il mio campione pom posso rimuovere la sl4f-api dipendenza, ma aggiungo alla pom il seguente:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.7</version> 
      <scope>compile</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

e ri-ri-eseguire il comando albero delle dipendenze, ho finalmente lo stesso del vostro screenshot:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- 
[INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT 
[INFO] \- org.apache.openejb:openejb-core:jar:4.7.0:provided 
[INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.7:provided 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile 

Bingo: la sezione dependencyManagement è prevalente la portata della dipendenza transitiva, che colpisce anche la mediazione sul provided portata. Questo non è un bug, è di progettazione in quanto in questa sezione definisci il tipo di governance riguardante le tue dipendenze. Il diagramma in questo caso è anche corretto e non fuorviante, poiché la dipendenza viene introdotta solo da openejb-core, che viene quindi modificata dalla decisione dependencyManagement di inserire sl4f-api nell'ambito compile.

+0

Grazie per la risposta dettagliata. Sembra essere il caso di dependencyManagement. Non ero a conoscenza di un tale comportamento malvagio –

+0

Grazie per una risposta così dettagliata, ho chiarito alcune cose per me. –

Problemi correlati