Afhankelijkheidsbereiken van Maven

1. Inleiding

Maven is een van de meest populaire build-tools in het Java-ecosysteem en een van de kernfuncties is afhankelijkheidsbeheer.

In dit artikel gaan we het mechanisme beschrijven en verkennen dat helpt bij het beheren van transitieve afhankelijkheden in Maven-projecten - afhankelijkheidsbereiken.

2. Overgankelijke afhankelijkheid

Simpel gezegd, er zijn twee soorten afhankelijkheden in Maven direct en transitief.

Directe afhankelijkheden zijn degene die expliciet in het project zijn opgenomen. Deze kunnen via tags:

 junit junit 4.12 

Transitieve afhankelijkheden zijn daarentegen afhankelijkheden die vereist zijn door onze directe afhankelijkheden. Vereiste transitieve afhankelijkheden worden door Maven automatisch in ons project opgenomen.

We kunnen alle afhankelijkheden, inclusief transitieve afhankelijkheden, in het project weergeven met behulp van: mvn-afhankelijkheid: boom opdracht.

3. Afhankelijkheidsbereik

Afhankelijkheidsbereiken kunnen helpen om de transitiviteit van de afhankelijkheden te beperken en ze wijzigen het klassenpad voor verschillende gebouwde taken. Maven heeft 6 standaard afhankelijkheidsbereiken.

En het is belangrijk om te begrijpen dat elke scope - behalve voor importeren - heeft een impact op transitieve afhankelijkheden.

3.1. Compileren

Dit is het standaardbereik als er geen ander bereik is opgegeven.

Afhankelijkheden met dit bereik zijn beschikbaar op het klassenpad van het project in alle build-taken en worden doorgegeven aan de afhankelijke projecten.

Wat nog belangrijker is, deze afhankelijkheden zijn ook transitief:

 commons-lang commons-lang 2.6 

3.2. Voorzien

Deze scope wordt gebruikt om te markeren afhankelijkheden die tijdens runtime door JDK of een container moeten worden geleverd, Vandaar de naam.

Een goede use case voor deze scope is een webtoepassing die in een container wordt geïmplementeerd, waar de container zelf al enkele bibliotheken bevat.

Bijvoorbeeld, een webserver die de Servlet API al tijdens runtime levert, dus in ons project kunnen die afhankelijkheden worden gedefinieerd met de voorzien reikwijdte:

 javax.servlet servlet-api 2.5 voorzien 

De voorzien afhankelijkheden zijn alleen beschikbaar tijdens het compileren en in het testklassenpad van het project; wat meer is, ze zijn niet transitief.

3.3. Looptijd

De afhankelijkheden met dit bereik zijn vereist tijdens runtime, maar ze zijn niet nodig voor het compileren van de projectcode. Daarom zijn afhankelijkheden gemarkeerd met de looptijd scope zal aanwezig zijn in runtime en test classpath, maar ze zullen ontbreken in compile classpath.

Een goed voorbeeld van afhankelijkheden die het runtime-bereik zouden moeten gebruiken, is een JDBC-stuurprogramma:

 mysql mysql-connector-java 6.0.6 runtime 

3.4. Test

Dit bereik wordt gebruikt om aan te geven dat afhankelijkheid niet vereist is tijdens de standaard runtime van de applicatie, maar alleen wordt gebruikt voor testdoeleinden. Test afhankelijkheden zijn niet transitief en zijn alleen aanwezig voor test- en uitvoeringsklassepaden.

De standaard use case voor deze scope is het toevoegen van een testbibliotheek zoals JUnit aan onze applicatie:

 junit junit 4.12 test 

3.5. Systeem

Systeem scope lijkt veel op de voorzien reikwijdte. Het belangrijkste verschil tussen die twee scopes is dat systeem vereist dat we rechtstreeks naar een specifieke jar op het systeem wijzen.

Het belangrijkste om te onthouden is dat het bouwen van het project met systeem bereikafhankelijkheden kunnen op verschillende machines mislukken als afhankelijkheden niet aanwezig zijn of zich op een andere plaats bevinden dan de ene systemPath wijst naar:

 com.baeldung aangepaste afhankelijkheid 1.3.2 systeem $ {project.basedir} /libs/custom-dependency-1.3.2.jar 

3.6. Importeren

Deze scope is toegevoegd in Maven 2.0.9 en het is alleen beschikbaar voor het afhankelijkheidstype pom. We gaan in toekomstige artikelen meer praten over het type afhankelijkheid.

Importeren geeft aan dat deze afhankelijkheid moet worden vervangen door alle effectieve afhankelijkheden die in zijn POM zijn gedeclareerd:

 com.baeldung custom-project 1.3.2 pom import 

4. Toepassingsgebied en transitiviteit

Elk afhankelijkheidsbereik beïnvloedt transitieve afhankelijkheden op zijn eigen manier. Dit betekent dat verschillende transitieve afhankelijkheden in het project kunnen eindigen met verschillende scopes.

Afhankelijkheden met scopes voorzien en test zal nooit worden opgenomen in het hoofdproject.

Dan:

  • Voor de compileren bereik, alle afhankelijkheden met runtime-bereik wordt ingetrokken met de looptijd scope, in het project en alle afhankelijkheden met de compileren scope wordt ingetrokken met de compileren scope, in het project
  • Voor de voorzien bereik, beide looptijd en compileren bereikafhankelijkheden worden opgenomen met de voorzien scope, in het project
  • Voor de test bereik, beide looptijd en compileren scope transitieve afhankelijkheden worden ingetrokken met de test scope, in het project
  • Voor de looptijd bereik, beide looptijd en compileren scope transitieve afhankelijkheden worden ingetrokken met de looptijd scope, in het project

5. Conclusie

In deze korte zelfstudie hebben we ons gericht op Maven-afhankelijkheidsbereiken, hun doel en de details van hoe ze werken.

Als je dieper in Maven wilt graven, is de documentatie een prima plek om te beginnen.