[java] Ordine di dipendenza di Maven



Answers

Quando dichiari la tua dipendenza dall'altro file jar puoi dire di escludere la dipendenza transitiva dal file jar in conflitto:

    <dependency>
        <groupId>group</groupId>
        <artifactId>artifact</artifactId>
        <version>1.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>othergroup</groupId>
                <artifactId>ArtifactToExclude</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
Question

Nel mio progetto c'è una classe che implementa un'interfaccia. L'interfaccia proviene da una dipendenza. Ho un'altra dipendenza che ha una dipendenza da un jar che contiene anche la stessa interfaccia, tranne una versione con più metodi; i due vasi contenenti la stessa interfaccia di pacchetto NON hanno lo stesso groupId o artefatto.
La compilazione sta fallendo perché il compilatore si lamenta che la classe nel mio progetto non sta implementando tutti i metodi. Ho capito che è perché il compilatore sta prendendo il riferimento all'interfaccia dal vaso sbagliato. La mia domanda è: perché Maven usa l'interfaccia dalla dipendenza transitiva invece di quella dal barattolo che menziono esplicitamente nel progetto POM? Riesco a vedere che il barattolo utilizzato viene visualizzato in precedenza nella definizione (quindi immagino anche nel classpath), ma in questi casi ho pensato risolverlo utilizzando la classe / interfaccia in collisione dalla dipendenza con il percorso più breve

Qui fa parte dell'albero delle dipendenze. Notare che questo è in grepping ma si può ancora vedere che javax.servlet:servlet-api (quello effettivamente usato) è più profondo nella struttura rispetto a tomcat:servlet (quello che dovrebbe essere usato)

[builder@ca-rd-build11 proj]$ mvn dependency:tree | grep servlet
[INFO] |  +- javax.servlet:servlet-api:jar:2.4:compile
[INFO] +- tomcat:servlet:jar:4.0.6:compile

Sto usando Maven 3.0.4




Links



Tags

java java   maven maven   jar