Differenza tra scope maven compilato e fornito per l’imballaggio JAR

Qual è la differenza tra lo scope maven compile e provided quando artefatto è costruito come JAR? Se fosse WAR, capirò – l’artefatto sarebbe incluso o meno in WEB-INF / lib. Ma in caso di un JAR non importa – le dipendenze non sono incluse. Devono essere su classpath quando il loro ambito è compile o provided . So che le dipendenze provided non sono transitive – ma è solo una differenza?

Dal Doc Maven :

  • compilare

    Questo è l’ambito predefinito, utilizzato se nessuno è specificato. Le dipendenze di compilazione sono disponibili in tutti i percorsi di class di un progetto. Inoltre, tali dipendenze vengono propagate a progetti dipendenti.

  • fornito

    Questo è molto simile alla compilazione, ma indica che ci si aspetta che JDK o un contenitore forniscano la dipendenza al runtime. Ad esempio, quando si crea un’applicazione Web per Java Enterprise Edition, si imposta la dipendenza sull’API servlet e le API Java EE correlate all’ambito fornito poiché il contenitore Web fornisce tali classi. Questo ambito è disponibile solo sul percorso di class di compilazione e test e non è transitivo.

Ricapitolare:

  • le dipendenze non sono transitive (come hai detto)
  • l’ambito fornito è disponibile solo sul percorso di class di compilazione e test, mentre l’ambito di compilazione è disponibile in tutti i percorsi di class.
  • le dipendenze fornite non sono pacchettizzate

Compilare significa che è necessario il JAR per compilare ed eseguire l’app. Per un’applicazione Web, ad esempio, il JAR verrà inserito nella directory WEB-INF / lib.

Fornito significa che è necessario il JAR per la compilazione, ma in fase di esecuzione è già disponibile un JAR fornito dall’ambiente in modo che non sia necessario incluso nella confezione dell’app. Per un’app Web, ciò significa che il file JAR non verrà inserito nella directory WEB-INF / lib.

Per un’app Web, se il server dell’app fornisce già il JAR (o le sue funzionalità), quindi utilizzare “fornito” altrimenti utilizzare “compile”.

Ecco il riferimento.

Se si prevede di generare un singolo file JAR con tutte le sue dipendenze (il tipico xxxx-all.jar), l’ambito fornito è importante, poiché le classi all’interno di questo ambito non saranno incluse nel JAR risultante.

Vedi maven-assembly-plugin per maggiori informazioni

Ecco il brief su tutte le dipendenze supportate (fonte maven doc )

compilare

Questo è l’ambito predefinito, utilizzato se nessuno è specificato. Le dipendenze di compilazione sono disponibili in tutti i percorsi di class di un progetto. Inoltre, tali dipendenze vengono propagate a progetti dipendenti.

fornito

Questo è molto simile alla compilazione, ma indica che ci si aspetta che JDK o un contenitore forniscano la dipendenza al runtime. Ad esempio, quando si crea un’applicazione Web per Java Enterprise Edition, si imposta la dipendenza sull’API servlet e le API Java EE correlate all’ambito fornito poiché il contenitore Web fornisce tali classi. Questo ambito è disponibile solo sul percorso di class di compilazione e test e non è transitivo.

runtime

Questo ambito indica che la dipendenza non è richiesta per la compilazione, ma è per l’esecuzione. È nel runtime e verifica i percorsi di class, ma non il classpath di compilazione.

test

Questo ambito indica che la dipendenza non è richiesta per il normale utilizzo dell’applicazione ed è disponibile solo per la fase di compilazione e di esecuzione del test. Questo ambito non è transitivo.

sistema

Questo ambito è simile a quanto previsto, tranne per il fatto che devi fornire il JAR che lo contiene esplicitamente. L’artefatto è sempre disponibile e non è cercato in un repository.

import (disponibile solo in Maven 2.0.9 o successivo)

Questo ambito è supportato solo su una dipendenza di tipo pom nella sezione. Indica la dipendenza da sostituire con l’elenco delle dipendenze nella sezione POM specificata. Dal momento che vengono sostituiti, le dipendenze con un ambito di importazione in realtà non partecipano a limitare la transitività di una dipendenza.

  • compilare

Rendi disponibile nel percorso della class, non aggiungere questa dipendenza nel jar finale se è un normale jar; ma aggiungi questo barattolo nel barattolo se il barattolo finale è un singolo barattolo (ad esempio, un barattolo eseguibile)

  • fornito

La dipendenza sarà disponibile in ambiente di runtime quindi non aggiungere comunque questa dipendenza; anche non in jar singolo (es. jar eseguibile ecc.)

Per un file jar, la differenza è nel classpath elencato nel file MANIFEST.MF incluso nel jar se addClassPath è impostato su true nella configurazione di maven-jar-plugin. le dipendenze ‘compilate’ appariranno nel manifest, le dipendenze ‘fornite’ no.

Uno dei miei animaletti è che queste due parole dovrebbero avere lo stesso tempo. Compilati e forniti, o compilati e forniti.