Jaka jest różnica między uruchamianiem aplikacji Java za pomocą java -cp CLASSPATH
i java -jar JAR_FILE_PATH
? Czy jeden z nich jest preferowany do uruchamiania aplikacji Java? Mam na myśli, który z tych sposobów jest droższy dla JVM (w zależności od wykorzystania zasobów maszynowych)?
Który z nich spowoduje, że JVM utworzy więcej wątków podczas próby uruchomienia aplikacji?
Za pomocą
-cp
argumentu podajesz ścieżkę klas, tj. Ścieżki do dodatkowych klas lub bibliotek, których Twój program może wymagać podczas kompilowania lub uruchamiania. Za pomocą-jar
określ wykonywalny plik JAR, który chcesz uruchomić.Nie możesz określić ich obu. Jeśli spróbujesz uciec,
java -cp folder/myexternallibrary.jar -jar myprogram.jar
to nie zadziała. Ścieżka klas dla tego pliku JAR powinna być określona w jego Manifeście, a nie jako-cp
argument.Więcej na ten temat można znaleźć tutaj i tutaj .
PS:
-cp
i-classpath
są synonimami.źródło
-cp
a-classpath
, to nie, nie ma różnicy.-jar
określasz, jaki wykonywalny plik JAR chcesz uruchomić. Z-cp
określeniem ścieżki (ścieżek) do dodatkowych klas / bibliotek, których może wymagać Twój program. Te 2 mają bardzo różne cele.java -jar PATH -cp PATH2
Podczas korzystania z usługi
java -cp
wymagane jest podanie w pełni kwalifikowanej nazwy klasy głównej, npjava -cp com.mycompany.MyMain
Korzystając
java -jar myjar.jar
z pliku jar, należy podać informacje o głównej klasie za pośrednictwem manifest.mf zawartej w pliku jar w folderzeMETA-INF
:Main-Class: com.mycompany.MyMain
źródło
java -cp ŚCIEŻKA KLASY jest niezbędna, jeśli chcesz określić cały kod w ścieżce klas. Jest to przydatne do debugowania kodu.
Format wykonywalny jarred:
java -jar JarFile
może być używany, jeśli chcesz uruchomić aplikację za pomocą jednego krótkiego polecenia. Możesz określić dodatkowe zależne pliki jar w swoim MANIFESTIE, używając plików jar oddzielonych spacjami we wpisie Class-Path, np .:Oba są porównywalne pod względem wydajności.
źródło
Jak już zostało powiedziane, -cp służy tylko do informowania jvm w wierszu poleceń, której klasy ma użyć w głównym wątku i gdzie może znaleźć biblioteki (zdefiniować ścieżkę klas). In -jar oczekuje, że ścieżka-klasy i klasa główna zostaną zdefiniowane w manifeście pliku jar. Więc inne służy do definiowania rzeczy w linii poleceń, a inne do znajdowania ich w manifeście jar. Nie ma różnicy w wydajności. Nie możesz ich używać w tym samym czasie, -jar zastąpi -cp.
Chociaż nawet jeśli użyjesz -cp, nadal będzie sprawdzać plik manifestu. Możesz więc zdefiniować niektóre ścieżki klas w manifeście, a inne w linii poleceń. Jest to szczególnie przydatne, gdy masz zależność od jakiegoś pliku jar innej firmy, którego możesz nie dostarczyć wraz z kompilacją lub nie chcesz go udostępniać (na przykład spodziewając się, że znajduje się on już w systemie, w którym ma być zainstalowany). Możesz więc użyć go do dostarczenia zewnętrznych słoików. Jego lokalizacja może się różnić w różnych systemach lub może nawet mieć inną wersję w innym systemie (ale z tymi samymi interfejsami). W ten sposób możesz zbudować aplikację z inną wersją i dodać rzeczywistą zależność innej firmy do ścieżki klasy w wierszu poleceń podczas uruchamiania jej w różnych systemach.
źródło
Nie będzie żadnej różnicy w wydajności. Używając java - cp możemy określić wymagane klasy i pliki jar w ścieżce klas do uruchomienia pliku klas java.
Jeśli jest to wykonywalny plik jar. Gdy używana jest komenda java -jar, jvm znajduje klasę, którą potrzebuje do uruchomienia, z pliku /META-INF/MANIFEST.MF wewnątrz pliku jar.
źródło