Transitiviteit van Afhankelijkheden

Ons project kan afhankelijk zijn van een ander project en dit project kan op zijn beurt weer afhankelijk zijn van een ander project. Deze keten van afhankelijkheden noemen we overgankelijk of transitief.

Dit is een belangrijk iets want zo worden afhankelijkheden, afhankelijk van hun scope, mee overgenomen van project naar project. Als wij een project (A) gebruiken die zelf een ander project (B) met scope compile gebruikt, dan krijgen wij via de gedownloade Jar ook automatisch B binnen als we afhankelijk zijn van A.

Wij werken aan project A. Project A heeft een afhankelijkheid van project B. en project B heeft op zijn beurt een afhankelijkheid van project C.

Als dit de casus is waar we mee aan de slag gaan. Hoe zit het dan als we verschillende scopes hebben voor B en C, met de afhankelijkheid van A op C?

Wel, laten we starten met de simpelste. Als C op scope provided of test staat in B, dan is deze niet mee verpakt. Dit wil zeggen dat A geen afhankelijkheid heeft van C.

Als C op de scope compile staat, dan zal A voor C dezelfde Scope behouden als voor B. Als B dus provided is voor A, zal ook C provided zijn voor A.

De laatste optie is als C de scope runtime heeft in project B. Als project B provided of test is, dan is er geen verschil. Maar voor zowel compile als runtime zal A de scope runtime hanteren voor C.

Het is mogelijk om een afhankelijkheid te definiëren die niet mag overgaan op andere projecten en enkel dient voor dit project, ondanks dat die op de compile scope staat. Dit kan gedaan worden door aan de dependecy de tag optional mee te geven, en dit true te maken.

<dependency>
    <groupId>group</groupId>
    <artifactId>artefact</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>

Eveneens kunnen we overgankelijke afhankelijkheden (project C) expliciet gaan uitsluiten met de exclusions tag binnen de dependency tag.

<dependency>
    <groupId>group</groupId>
    <artifactId>artefact</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>group</groupId>
            <artifactId>artifact</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Door deze uitsluiting kunnen mogelijke conflicten in versie nummering vermeden worden. We gaan hier in het volgende topic, dieper op in.