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:
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
.
è la stessa dipendenza introdotta anche in modo transitorio da un'altra dipendenza nella compilazione dell'ambito? –
No. Proprio in questo uno –
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 –