Was ist der Unterschied zwischen dem Maven-Bereich compile
und provided
dem Artefakt, der als JAR erstellt wird? Wenn es WAR wäre, würde ich verstehen - das Artefakt wäre in WEB-INF / lib enthalten oder nicht. Bei einer JAR spielt dies jedoch keine Rolle - Abhängigkeiten sind nicht enthalten. Sie müssen sich im Klassenpfad befinden, wenn ihr Gültigkeitsbereich compile
oder ist provided
. Ich weiß, dass provided
Abhängigkeiten nicht transitiv sind - aber ist es nur ein Unterschied?
JAR packaging
Kontext nach. Maven Doc erwähnt es nicht. Ich benutze Maven für eine Weile, aber ich habe mich gerade schon danach gefragt :) Es scheint also, dass es imJAR packaging
Kontext keinen Unterschied zwischencompile
und gibtprovided
(außer dem Abhängigkeitsübergang). Habe ich recht?compile
und nicht, wenn der Bereich vorhanden istprovided
.Hier ist die Referenz.
quelle
mvn exec:java
Ausführen keine bereitgestellte Abhängigkeit hinzugefügt , sondern eine kompilierte Abhängigkeit.Wenn Sie vorhaben, eine einzelne JAR-Datei mit all ihren Abhängigkeiten (die typische xxxx-all.jar) zu generieren, ist der bereitgestellte Bereich von Bedeutung, da die Klassen in diesem Bereich nicht in der resultierenden JAR enthalten sind.
Weitere Informationen finden Sie unter Maven-Assembly-Plugin
quelle
maven-assembly-plugin
, interessant, dass die am besten bewerteten Antworten es nicht erwähnen.Stellen Sie diese Abhängigkeit nicht in das endgültige JAR ein, wenn es sich um ein normales JAR handelt. Fügen Sie dieses Glas jedoch in das Glas ein, wenn das letzte Glas ein einzelnes Glas ist (z. B. ein ausführbares Glas).
Die Abhängigkeit ist zur Laufzeitumgebung verfügbar. Fügen Sie diese Abhängigkeit daher auf keinen Fall hinzu. auch nicht in einem einzigen Glas (dh ausführbaren Glas usw.)
quelle
Bei einer JAR-Datei liegt der Unterschied im Klassenpfad, der in der im JAR enthaltenen Datei MANIFEST.MF aufgeführt ist, wenn addClassPath in der Konfiguration des Maven-JAR-Plugins auf true gesetzt ist. Abhängigkeiten zum Kompilieren werden im Manifest angezeigt, vorausgesetzt, Abhängigkeiten werden nicht angezeigt.
Eines meiner Lieblingsprobleme ist, dass diese beiden Wörter dieselbe Zeitform haben sollten. Entweder kompiliert und bereitgestellt oder kompiliert und bereitgestellt.
quelle
Wenn Sie den Maven-Bereich als festlegen
provided
, bedeutet dies, dass beim Ausführen des Plugins die tatsächlich verwendete Abhängigkeitsversion von der von Ihnen installierten Version von Apache Maven abhängt.quelle
Wenn die JAR-Datei wie die ausführbare Spring-Boot-JAR-Datei ist, müssen alle Abhängigkeiten
compile
alle JAR-Dateien enthalten.Wenn die JAR-Datei jedoch in anderen Paketen oder Anwendungen verwendet wird, müssen nicht alle Abhängigkeiten in die JAR-Datei aufgenommen werden, da diese Pakete oder Anwendungen selbst andere Abhängigkeiten bereitstellen können.
quelle