Jaka jest różnica między zasięgiem maven compile
a provided
budowaniem artefaktu jako JAR? Gdyby to była WOJNA, zrozumiałbym - artefakt byłby włączony lub nie w WEB-INF / lib. Ale w przypadku JAR nie ma to znaczenia - zależności nie są uwzględniane. Muszą znajdować się w ścieżce klas, gdy ich zakres to compile
lub provided
. Wiem, że provided
zależności nie są przechodnie - ale czy to tylko jedna różnica?
260
JAR packaging
kontekście. Doktor Maven nie wspomina o tym. Używam Maven przez jakiś czas, ale ja właśnie już zadawałem sobie pytanie o to :) Tak więc wydaje się, że wJAR packaging
kontekście, nie ma żadnej różnicy międzycompile
iprovided
(z wyjątkiem przejścia zależności). Czy mam rację?compile
i nie będzie, jeśli zakres jestprovided
.Oto odniesienie.
źródło
mvn exec:java
jest uruchamiana, ale zależność skompilowana jest.Jeśli planujesz wygenerować pojedynczy plik JAR ze wszystkimi jego zależnościami (typowy xxxx-all.jar), wówczas podany zakres ma znaczenie, ponieważ klasy w tym zakresie nie zostaną umieszczone w wynikowym pliku JAR.
Aby uzyskać więcej informacji, zobacz maven-assembly-plugin
źródło
maven-assembly-plugin
, ciekawe, że w najczęściej głosowanych odpowiedziach nie ma o tym mowy.Udostępnij w ścieżce klasy, nie dodawaj tej zależności do końcowego jar, jeśli jest to normalny jar; ale dodaj ten słoik do słoika, jeśli słoik końcowy jest pojedynczym słoikiem (na przykład słoik wykonywalny)
Zależność będzie dostępna w środowisku wykonawczym, więc w żadnym wypadku nie dodawaj tej zależności; nawet nie w jednym słoiku (tj. słoik wykonywalny itp.)
źródło
W przypadku pliku jar różnica występuje w ścieżce klasy wymienionej w pliku MANIFEST.MF zawartym w pliku jar, jeśli parametr addClassPath ma wartość true w konfiguracji wtyczki maven-jar-plugin. W pliku manifestu pojawią się zależności „kompiluj”, a zależności „pod warunkiem” nie.
Jednym z moich podejrzeń jest to, że te dwa słowa powinny mieć ten sam czas. Albo skompilowany i udostępniony, albo skompilowany i udostępniony.
źródło
Po ustawieniu zakresu maven jako
provided
oznacza to, że po uruchomieniu wtyczki rzeczywista zastosowana wersja zależności będzie zależeć od zainstalowanej wersji Apache Maven.źródło
Jeśli plik jar jest jak wykonywalny plik jar jar rozruchu wiosennego, wówczas zakres wszystkich zależności musi
compile
obejmować wszystkie pliki jar.Ale jeśli plik jar używany w innych pakietach lub aplikacjach, nie musi uwzględniać wszystkich zależności w pliku jar, ponieważ te pakiety lub aplikacje mogą same zapewniać inne zależności.
źródło