Ambiti di dipendenza Maven

1. Introduzione

Maven è uno degli strumenti di compilazione più popolari nell'ecosistema Java e una delle sue caratteristiche principali è la gestione delle dipendenze.

In questo articolo, descriveremo ed esploreremo il meccanismo che aiuta nella gestione delle dipendenze transitive nei progetti Maven: ambiti di dipendenza.

2. Dipendenza transitiva

In poche parole, ci sono due tipi di dipendenze in Maven dirette e transitive.

Le dipendenze dirette sono quelle esplicitamente incluse nel progetto. Questi possono essere inclusi nel progetto utilizzando tag:

 junit junit 4.12 

Le dipendenze transitive, d'altra parte, sono dipendenze richieste dalle nostre dipendenze dirette. Le dipendenze transitive richieste vengono incluse automaticamente nel nostro progetto da Maven.

Possiamo elencare tutte le dipendenze comprese le dipendenze transitive nel progetto usando: mvn dependency: tree command.

3. Ambiti di dipendenza

Gli ambiti di dipendenza possono aiutare a limitare la transitività delle dipendenze e modificano il classpath per diverse attività create. Maven ha 6 ambiti di dipendenza predefiniti .

Ed è importante capire che ogni ambito, ad eccezione dell'importazione , ha un impatto sulle dipendenze transitive.

3.1. Compilare

Questo è l'ambito predefinito quando non viene fornito nessun altro ambito.

Le dipendenze con questo ambito sono disponibili nel percorso di classe del progetto in tutte le attività di compilazione e vengono propagate ai progetti dipendenti.

Ancora più importante, anche queste dipendenze sono transitive:

 commons-lang commons-lang 2.6 

3.2. Fornito

Questo ambito viene utilizzato per contrassegnare le dipendenze che dovrebbero essere fornite in fase di esecuzione da JDK o da un contenitore , da cui il nome.

Un buon caso d'uso per questo ambito sarebbe un'applicazione Web distribuita in un contenitore, in cui il contenitore fornisce già alcune librerie stesso.

Ad esempio, un server Web che fornisce già l'API Servlet in fase di esecuzione, quindi nel nostro progetto, tali dipendenze possono essere definite con l' ambito fornito :

 javax.servlet servlet-api 2.5 provided 

Le dipendenze fornite sono disponibili solo in fase di compilazione e nel classpath di test del progetto; inoltre non sono transitivi.

3.3. Runtime

Le dipendenze con questo ambito sono richieste in fase di esecuzione , ma non sono necessarie per la compilazione del codice del progetto. Per questo motivo, le dipendenze contrassegnate con l' ambito di runtime saranno presenti in runtime e test classpath, ma mancheranno dal classpath di compilazione.

Un buon esempio di dipendenze che dovrebbero utilizzare l'ambito di runtime è un driver JDBC:

 mysql mysql-connector-java 6.0.6 runtime 

3.4. Test

Questo ambito viene utilizzato per indicare che la dipendenza non è richiesta durante il runtime standard dell'applicazione, ma viene utilizzata solo a scopo di test. Le dipendenze di test non sono transitive e sono presenti solo per i percorsi di classe di test ed esecuzione.

Il caso d'uso standard per questo ambito è l'aggiunta di una libreria di test come JUnit alla nostra applicazione:

 junit junit 4.12 test 

3.5. Sistema

L' ambito del sistema è molto simile all'ambito fornito . La differenza principale tra questi due ambiti è che il sistema richiede di puntare direttamente a un jar specifico sul sistema.

La cosa importante da ricordare è che la creazione del progetto con dipendenze dell'ambito del sistema potrebbe non riuscire su macchine diverse se le dipendenze non sono presenti o si trovano in una posizione diversa da quella a cui punta systemPath :

 com.baeldung custom-dependency 1.3.2 system ${project.basedir}/libs/custom-dependency-1.3.2.jar 

3.6. Importare

Questo ambito è stato aggiunto in Maven 2.0.9 ed è disponibile solo per il tipo di dipendenza pom . Parleremo di più sul tipo di dipendenza nei prossimi articoli.

L'importazione indica che questa dipendenza deve essere sostituita con tutte le dipendenze effettive dichiarate nel suo POM:

 com.baeldung custom-project 1.3.2 pom import 

4. Ambito e transitività

Ogni ambito di dipendenza influenza le dipendenze transitive a modo suo. Ciò significa che diverse dipendenze transitive possono finire nel progetto con ambiti diversi.

Tuttavia, le dipendenze con gli ambiti forniti e il test non verranno mai incluse nel progetto principale.

Poi:

  • Per l' ambito di compilazione , tutte le dipendenze con ambito di runtime verranno inserite con l' ambito di runtime , nel progetto e tutte le dipendenze con l' ambito di compilazione verranno inserite con l' ambito di compilazione , nel progetto
  • Per la condizione di applicazione, sia runtime e compilazione dipendenze ambito sarà tirato con la prevista ambito, nel progetto
  • Per l' ambito del test , le dipendenze transitive sia del runtime che dell'ambito della compilazione verranno inserite con l' ambito del test , nel progetto
  • Per l' ambito di runtime , le dipendenze transitive dell'ambito di runtime e di compilazione verranno inserite con l' ambito di runtime , nel progetto

5. conclusione

In questo breve tutorial, ci siamo concentrati sugli ambiti di dipendenza di Maven, sul loro scopo e sui dettagli di come funzionano.

Se vuoi approfondire Maven, la documentazione è un ottimo punto di partenza.