Java Language
Polecenie Java - „java” i „javaw”
Szukaj…
Składnia
java [ <opt> ... ] <class-name> [ <argument> ... ]
java [ <opt> ... ] -jar <jar-file-pathname> [ <argument> ... ]
Uwagi
Polecenie java
służy do uruchamiania aplikacji Java z wiersza polecenia. Jest dostępny jako część dowolnego środowiska Java SE JRE lub JDK.
W systemach Windows istnieją dwa warianty polecenia java
:
- Wariant
java
uruchamia aplikację w nowym oknie konsoli. - Wariant
javaw
uruchamia aplikację bez tworzenia nowego okna konsoli.
W innych systemach (np. Linux, Mac OSX, UNIX) dostępna jest tylko komenda java
i nie uruchamia ona nowego okna konsoli.
Symbol <opt>
w składni oznacza opcję w wierszu polecenia java
. Tematy „Opcje Java” i „Opcje rozmiaru stosu i stosu” obejmują najczęściej używane opcje. Inne są omówione w temacie Flagi JVM .
Uruchamianie wykonywalnego pliku JAR
Pliki wykonywalne JAR to najprostszy sposób na złożenie kodu Java w pojedynczy plik, który można wykonać. * (Uwaga redakcyjna: Tworzenie plików JAR powinno być objęte osobnym tematem.) *
Zakładając, że masz wykonywalny plik JAR o nazwie ścieżki <jar-path>
, powinieneś być w stanie uruchomić go w następujący sposób:
java -jar <jar-path>
Jeśli polecenie wymaga argumentów z wiersza polecenia, dodaj je po <jar-path>
. Na przykład:
java -jar <jar-path> arg1 arg2 arg3
Jeśli musisz podać dodatkowe opcje JVM w wierszu komend java
, muszą one przejść przed opcją -jar
. Zauważ, że opcja -cp
/ -classpath
zostanie zignorowana, jeśli użyjesz -jar
. Ścieżka klasy aplikacji jest określona przez manifest pliku JAR.
Uruchamianie aplikacji Java za pośrednictwem „głównej” klasy
Jeśli aplikacja nie została spakowana jako wykonywalny plik JAR, musisz podać nazwę klasy punktu wejścia w wierszu polecenia java
.
Prowadzenie klasy HelloWorld
Przykład „HelloWorld” opisano w sekcji Tworzenie nowego programu Java . Składa się z jednej klasy o nazwie HelloWorld
która spełnia wymagania dotyczące punktu wejścia.
Zakładając, że (skompilowany) plik „HelloWorld.class” znajduje się w bieżącym katalogu, można go uruchomić w następujący sposób:
java HelloWorld
Należy zwrócić uwagę na kilka ważnych rzeczy:
- Musimy podać nazwę klasy: nie nazwę ścieżki do pliku „.class” ani pliku „.java”.
- Jeśli klasa jest zadeklarowana w pakiecie (jak większość klas Java), to nazwa klasy, którą podajemy do komendy
java
musi być pełną nazwą klasy. Na przykład, jeśliSomeClass
zostanie zadeklarowany w pakieciecom.example
, wówczas pełna nazwa klasy tocom.example.SomeClass
.
Określanie ścieżki klasy
O ile nie korzystamy ze składni komendy java -jar
komenda java
szuka klasy do załadowania, przeszukując ścieżkę klasy; patrz Ścieżka klas . Powyższe polecenie polega na tym, że domyślną ścieżką klasy jest (lub włącznie) bieżący katalog. Możemy być bardziej precyzyjni w tej kwestii, określając ścieżkę klasy, która będzie używana przy użyciu opcji -cp
.
java -cp . HelloWorld
Oznacza to, że bieżący katalog (do którego odnosi się „.”) Jest jedynym wpisem w ścieżce klas.
-cp
jest opcją przetwarzaną przez komendę java
. Wszystkie opcje przeznaczone dla komendy java
powinny znajdować się przed nazwą klasy. Wszystko po klasie będzie traktowane jako argument wiersza polecenia dla aplikacji Java i będzie przekazywane do aplikacji w ciągu String[]
który jest przekazywany do metody main
.
(Jeśli nie podano opcji -cp
, java
użyje ścieżki klasy podanej przez zmienną środowiskową CLASSPATH
. Jeśli ta zmienna jest nieustawiona lub pusta, java
używa „.” Jako domyślnej ścieżki klasy.)
Klasy punktów wejścia
Klasa punktu wejścia Java ma main
metodę z następującymi podpisami i modyfikatorami:
public static void main(String[] args)
Sidenote: ze względu na działanie tablic może być również
(String args[])
Gdy komenda java
uruchamia maszynę wirtualną, ładuje określone klasy punktu wejścia i próbuje znaleźć main
. Jeśli się powiedzie, argumenty z wiersza poleceń są konwertowane na obiekty Java String
i składane w tablicę. Jeśli main
zostanie wywołany w ten sposób, tablica nie będzie miała null
i nie będzie zawierać żadnych pozycji null
.
Prawidłowa metoda klasy punktu wejścia musi wykonać następujące czynności:
- Bądź nazwany
main
(wielkość liter ma znaczenie) - Bądź
public
istatic
- Mają
void
typ zwrotu - Mają pojedynczy argument z tablicą
String[]
. Argument musi być obecny i nie może być więcej niż jeden argument. - Bądź ogólny: parametry typu są niedozwolone.
- Mają nieogólną, zamykającą klasę najwyższego poziomu (nie zagnieżdżoną ani wewnętrzną)
Klasyczne jest ogłaszanie klasy jako public
ale nie jest to absolutnie konieczne. Począwszy od języka Java 5, typ argumentu main
metody może być zmienną String
zamiast tablicy łańcuchowej. main
może opcjonalnie zgłaszać wyjątki, a jego parametr może mieć dowolną nazwę, ale konwencjonalnie jest to args
.
Punkty wejścia JavaFX
Począwszy od Java 8, komenda java
może także bezpośrednio uruchamiać aplikację JavaFX. JavaFX jest udokumentowany w znaczniku JavaFX , ale punkt wejścia JavaFX musi wykonać następujące czynności:
- Rozszerz
javafx.application.Application
- Bądź
public
a nieabstract
- Nie może być ogólny ani zagnieżdżony
- Mają jawny lub niejawny
public
konstruktor bez argumentów
Rozwiązywanie problemów z poleceniem „java”
Ten przykład obejmuje typowe błędy związane z używaniem polecenia „java”.
"Nie znaleziono polecenia"
Jeśli pojawi się komunikat o błędzie, taki jak:
java: command not found
podczas próby uruchomienia polecenia java
oznacza to, że na ścieżce wyszukiwania poleceń powłoki nie ma polecenia java
. Przyczyną może być:
- w ogóle nie masz zainstalowanego środowiska Java JRE lub JDK,
- nie zaktualizowałeś (poprawnie) zmiennej środowiskowej
PATH
w pliku inicjalizacji powłoki, lub - nie pobrałeś odpowiedniego pliku inicjującego w bieżącej powłoce.
Zobacz „Instalowanie Java”, aby dowiedzieć się, jakie kroki należy podjąć.
„Nie można znaleźć lub załadować klasy głównej”
Ten komunikat o błędzie jest generowany przez polecenie java
jeśli nie można znaleźć / załadować określonej klasy punktu wejścia. Ogólnie rzecz biorąc, istnieją trzy ogólne powody, dla których może się to zdarzyć:
- Podano klasę punktu wejścia, która nie istnieje.
- Klasa istnieje, ale została niepoprawnie określona.
- Klasa istnieje i została poprawnie określona, ale Java nie może jej znaleźć, ponieważ ścieżka klasy jest niepoprawna.
Oto procedura diagnozowania i rozwiązywania problemu:
Znajdź pełną nazwę klasy punktu wejścia.
- Jeśli masz kod źródłowy dla klasy, pełna nazwa składa się z nazwy pakietu i prostej nazwy klasy. Instancja klasy „Main” jest zadeklarowana w pakiecie „com.example.myapp”, a następnie jej pełna nazwa to „com.example.myapp.Main”.
- Jeśli masz skompilowany plik klasy, możesz znaleźć nazwę klasy, uruchamiając na niej
javap
. - Jeśli plik klasy znajduje się w katalogu, możesz wywnioskować pełną nazwę klasy na podstawie nazw katalogów.
- Jeśli plik klasy znajduje się w pliku JAR lub ZIP, możesz wywnioskować pełną nazwę klasy ze ścieżki pliku w pliku JAR lub ZIP.
Spójrz na komunikat o błędzie z polecenia
java
. Wiadomość powinna kończyć się pełną nazwą klasy, której próbuje użyćjava
.- Sprawdź, czy dokładnie odpowiada pełnej nazwie klasy dla klasy punktu wejścia.
- Nie powinien kończyć się na „.java” lub „.class”.
- Nie powinien zawierać ukośników ani żadnych innych znaków niezgodnych z prawem w identyfikatorze Java 1 .
- Obudowa nazwy powinna dokładnie pasować do pełnej nazwy klasy.
Jeśli używasz poprawnej nazwy klasy, upewnij się, że klasa faktycznie znajduje się w ścieżce klasy:
- Opracuj nazwę ścieżki, na którą mapowana jest nazwa klasy; zobacz Mapowanie nazw klas do nazw ścieżek
- Wypracuj, co to jest ścieżka klas; zobacz ten przykład: Różne sposoby określania ścieżki klasy
- Spójrz na każdy z plików JAR i ZIP w ścieżce klasy, aby sprawdzić, czy zawierają one klasę z wymaganą nazwą ścieżki.
- Spójrz na każdy katalog, aby zobaczyć, czy nazwa ścieżki rozwiązuje się w pliku w tym katalogu.
Jeśli ręczne sprawdzenie ścieżki klasy nie -Xdiag
problemu, można dodać opcje -Xdiag
i -XshowSettings
. Pierwsza z nich zawiera listę wszystkich klas, które są ładowane, a druga drukuje ustawienia, które zawierają efektywną ścieżkę klas dla JVM.
Wreszcie istnieją pewne niejasne przyczyny tego problemu:
- Plik wykonywalny JAR z atrybutem
Main-Class
który określa klasę, która nie istnieje. - Plik wykonywalny JAR z niepoprawnym atrybutem
Class-Path
. - Jeśli zepsujesz 2 opcje przed nazwą klasy, komenda
java
może spróbować zinterpretować jedną z nich jako nazwę klasy. - Jeśli ktoś zignorował reguły stylu Java i użył identyfikatora pakietu lub klasy, które różnią się tylko wielkością liter, a działasz na platformie, która traktuje wielkość liter w nazwach plików jako nieistotna.
- Problemy z homoglifami w nazwach klas w kodzie lub w wierszu poleceń.
„Nie znaleziono głównej metody w klasie <nazwa>”
Ten problem występuje, gdy komenda java
jest w stanie znaleźć i załadować klasę, którą wyznaczyłeś, ale nie jest w stanie znaleźć metody punktu wejścia.
Istnieją trzy możliwe wyjaśnienia:
- Jeśli próbujesz uruchomić wykonywalny plik JAR, manifest JAR ma niepoprawny atrybut „Main-Class”, który określa klasę, która nie jest prawidłową klasą punktu wejścia.
- Powiedziałeś komendzie
java
klasę, która nie jest klasą punktu wejścia. - Klasa punktu wejścia jest niepoprawna; Aby uzyskać więcej informacji, zobacz Klasy punktów wejścia .
Inne zasoby
- Co oznacza „Nie można znaleźć lub załadować głównej klasy”?
- http://docs.oracle.com/javase/tutorial/getStarted/problems/index.html
1 - W Javie 8 i nowszych polecenie java
pomoże mapować separator nazw plików („/” lub „”) na kropkę („.”). Jednak to zachowanie nie jest udokumentowane na stronach podręcznika.
2 - Naprawdę niejasny przypadek dotyczy skopiowania i wklejenia polecenia ze sformatowanego dokumentu, w którym edytor tekstu użył „długiego łącznika” zamiast zwykłego łącznika.
Uruchamianie aplikacji Java z zależnościami biblioteki
Jest to kontynuacja przykładów „klasy głównej” i „wykonywalnego JAR” .
Typowe aplikacje Java składają się z kodu aplikacji i różnych kodów bibliotek wielokrotnego użytku, które zostały zaimplementowane lub które zostały zaimplementowane przez strony trzecie. Te ostatnie są powszechnie określane jako zależności bibliotek i zwykle są pakowane jako pliki JAR.
Java jest językiem dynamicznie powiązanym. Po uruchomieniu aplikacji Java z zależnościami bibliotecznymi JVM musi wiedzieć, gdzie są zależności, aby w razie potrzeby mógł załadować klasy. Ogólnie rzecz biorąc, istnieją dwa sposoby radzenia sobie z tym:
Aplikację i jej zależności można ponownie spakować do jednego pliku JAR, który zawiera wszystkie wymagane klasy i zasoby.
JVM można dowiedzieć się, gdzie znaleźć zależne pliki JAR za pomocą ścieżki klas środowiska wykonawczego.
W przypadku wykonywalnego pliku JAR ścieżka klasy środowiska wykonawczego jest określona przez atrybut manifestu „Class-Path”. (Nota redakcyjna: Należy to opisać w osobnym temacie dotyczącym polecenia jar
). W przeciwnym razie CLASSPATH
klas środowiska wykonawczego musi zostać podana za pomocą opcji -cp
lub zmiennej środowiskowej CLASSPATH
.
Załóżmy na przykład, że w pliku „myApp.jar” mamy aplikację Java, której klasą punktu wejścia jest com.example.MyApp
. Załóżmy również, że aplikacja zależy od plików JAR biblioteki „lib / library1.jar” i „lib / library2.jar”. Możemy uruchomić aplikację za pomocą polecenia java
w następujący sposób w wierszu polecenia:
$ # Alternative 1 (preferred)
$ java -cp myApp.jar:lib/library1.jar:lib/library2.jar com.example.MyApp
$ # Alternative 2
$ export CLASSPATH=myApp.jar:lib/library1.jar:lib/library2.jar
$ java com.example.MyApp
(W systemie Windows użyłbyś ;
zamiast :
jako separatora ścieżki klas i CLASSPATH
(lokalną) zmienną CLASSPATH
za pomocą set
zamiast export
.)
Chociaż deweloper Java byłby z tym zadowolony, nie jest on „przyjazny dla użytkownika”. Dlatego powszechną praktyką jest pisanie prostego skryptu powłoki (lub pliku wsadowego systemu Windows) w celu ukrycia szczegółów, o których użytkownik nie musi wiedzieć. Na przykład, jeśli umieścisz następujący skrypt powłoki w pliku o nazwie „myApp”, sprawisz, że będzie on wykonywalny i umieścisz go w katalogu na ścieżce wyszukiwania poleceń:
#!/bin/bash
# The 'myApp' wrapper script
export DIR=/usr/libexec/myApp
export CLASSPATH=$DIR/myApp.jar:$DIR/lib/library1.jar:$DIR/lib/library2.jar
java com.example.MyApp
możesz uruchomić go w następujący sposób:
$ myApp arg1 arg2 ...
Wszelkie argumenty w wierszu poleceń zostaną przekazane do aplikacji Java za pośrednictwem rozszerzenia "$@"
. (Możesz zrobić coś podobnego z plikiem wsadowym Windows, chociaż składnia jest inna.)
Spacje i inne znaki specjalne w argumentach
Przede wszystkim problem obsługi spacji w argumentach NIE jest tak naprawdę problemem Java. Jest to raczej problem, który musi zostać rozwiązany przez powłokę poleceń, której używasz podczas uruchamiania programu Java.
Jako przykład załóżmy, że mamy następujący prosty program, który wypisuje rozmiar pliku:
import java.io.File;
public class PrintFileSizes {
public static void main(String[] args) {
for (String name: args) {
File file = new File(name);
System.out.println("Size of '" + file + "' is " + file.size());
}
}
}
Załóżmy teraz, że chcemy wydrukować rozmiar pliku, którego nazwa ścieżki zawiera spacje; np. /home/steve/Test File.txt
. Jeśli uruchomimy polecenie w ten sposób:
$ java PrintFileSizes /home/steve/Test File.txt
powłoka nie będzie wiedziała, że /home/steve/Test File.txt
to tak naprawdę jedna ścieżka. Zamiast tego przekaże 2 różne argumenty do aplikacji Java, która spróbuje znaleźć odpowiednie rozmiary plików, i zawiedzie, ponieważ pliki o tych ścieżkach (prawdopodobnie) nie istnieją.
Rozwiązania wykorzystujące powłokę POSIX
Pociski POSIX obejmują również sh
, takie jak bash
i ksh
. Jeśli używasz jednej z tych powłok, możesz rozwiązać problem, podając argument.
$ java PrintFileSizes "/home/steve/Test File.txt"
Podwójne cudzysłowy wokół nazwy ścieżki mówią powłoce, że powinna zostać przekazana jako pojedynczy argument. Cytaty zostaną usunięte, gdy to nastąpi. Można to zrobić na kilka innych sposobów:
$ java PrintFileSizes '/home/steve/Test File.txt'
Pojedyncze (proste) cudzysłowy są traktowane jak podwójne cudzysłowy, z tym wyjątkiem, że tłumią także różne rozwinięcia argumentu.
$ java PrintFileSizes /home/steve/Test\ File.txt
Ukośnik odwrotny unika następującej spacji i powoduje, że nie jest interpretowany jako separator argumentów.
Aby uzyskać bardziej wyczerpującą dokumentację, w tym opisy postępowania z innymi znakami specjalnymi w argumentach, zapoznaj się z tematem cytowania w dokumentacji Bash .
Rozwiązanie dla systemu Windows
Podstawowym problemem systemu Windows jest to, że na poziomie systemu operacyjnego argumenty są przekazywane do procesu potomnego jako pojedynczy ciąg ( źródło ). Oznacza to, że ostateczna odpowiedzialność za analizowanie (lub ponowne parsowanie) wiersza poleceń spoczywa na dowolnym programie lub jego bibliotekach wykonawczych. Istnieje wiele niespójności.
W przypadku Java, krótko mówiąc:
Możesz wstawiać cudzysłowy wokół argumentu w poleceniu
java
, co pozwoli ci przekazywać argumenty ze spacjami.Najwyraźniej sama komenda
java
analizuje ciąg komendy i robi to mniej więcej poprawnieJednak, gdy spróbujesz połączyć to z użyciem
SET
i podstawiania zmiennych w pliku wsadowym, staje się bardzo skomplikowane, czy podwójne cudzysłowy zostaną usunięte.Powłoka
cmd.exe
najwyraźniej ma inne mechanizmy ucieczki; np. podwojenie podwójnych cudzysłowów i użycie^
.
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją pliku wsadowego .
Opcje Java
Polecenie java
obsługuje szeroki zakres opcji:
Wszystkie opcje zaczynają się od pojedynczego łącznika lub znaku minus (
-
): konwencja GNU / Linux dotycząca używania opcji--
dla „długich” opcji nie jest obsługiwana.Opcje musi pojawić się przed
<classname>
lub-jar <jarfile>
argumentu uznawane. Wszelkie argumenty po nich będą traktowane jako argumenty przekazywane do uruchomionej aplikacji Java.Opcje, które nie zaczynają się od
-X
lub-XX
są opcjami standardowymi. Możesz polegać na wszystkich implementacjach Java 1 w celu obsługi dowolnej standardowej opcji.Opcje zaczynające się od
-X
są opcjami niestandardowymi i mogą być wycofane z jednej wersji Java do następnej.Opcje zaczynające się od
-XX
są opcjami zaawansowanymi i mogą być również wycofane.
Ustawienie właściwości systemu za pomocą -D
-D<property>=<value>
Opcja ta służy do ustawienia właściwości w systemie Properties
obiektu. Ten parametr można powtórzyć, aby ustawić różne właściwości.
Opcje Memory, Stack i Garbage Collector
Główne opcje kontrolowania rozmiarów sterty i stosu są udokumentowane w sekcji Ustawianie rozmiarów sterty, PermGen i stosu . (Nota redakcyjna: Opcje Garbage Collectora powinny być opisane w tym samym temacie).
Włączanie i wyłączanie asercji
Do -ea
i -da
opcje odpowiednio włączać i wyłączać Java assert
sprawdzenie:
- Wszystkie sprawdzanie asercji jest domyślnie wyłączone.
- Opcja
-ea
umożliwia sprawdzenie wszystkich asercji -
-ea:<packagename>...
umożliwia sprawdzenie asercji w paczce i wszystkich paczkach . -
-ea:<classname>...
nazwa klasy-ea:<classname>...
umożliwia sprawdzanie asercji w klasie. - Opcja
-da
wyłącza sprawdzanie wszystkich asercji - Opcja
-da:<packagename>...
wyłącza sprawdzanie asercji w paczce i wszystkich paczkach . - Opcja
-da:<classname>...
nazwa klasy-da:<classname>...
wyłącza sprawdzanie asercji w klasie. - Opcja
-esa
umożliwia sprawdzanie wszystkich klas systemowych. - Opcja
-dsa
wyłącza sprawdzanie wszystkich klas systemowych.
Opcje można łączyć. Na przykład.
$ # Enable all assertion checking in non-system classes
$ java -ea -dsa MyApp
$ # Enable assertions for all classes in a package except for one.
$ java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyApp
Zauważ, że włączenie sprawdzania asercji może zmienić zachowanie programowania Java.
- Generalnie spowalnia to aplikację.
- Może to powodować, że niektóre metody będą działać dłużej, co może zmienić taktowanie wątków w aplikacji wielowątkowej.
- Może wprowadzić nieoczekiwane zdarzenia przed relacjami, które mogą spowodować zniknięcie anomalii pamięci.
- Niepoprawnie zaimplementowana instrukcja
assert
może mieć niepożądane skutki uboczne.
Wybieranie typu maszyny wirtualnej
-client
i -server
umożliwiają wybranie jednej z dwóch różnych postaci maszyny wirtualnej HotSpot:
- Formularz „klienta” jest dostosowany do aplikacji użytkownika i zapewnia szybsze uruchamianie.
- Formularz „serwer” jest dostosowany do długo działających aplikacji. Przechwytywanie statystyk trwa dłużej podczas „rozgrzewania” JVM, co pozwala kompilatorowi JIT lepiej wykonać optymalizację kodu natywnego.
Domyślnie JVM będzie działać w trybie 64-bitowym, jeśli to możliwe, w zależności od możliwości platformy. -d32
i -d64
pozwalają jawnie wybrać tryb.
1 - Sprawdź oficjalną instrukcję komendy java
. Czasami standardowa opcja jest opisywana jako „może ulec zmianie”.