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śli SomeClass zostanie zadeklarowany w pakiecie com.example , wówczas pełna nazwa klasy to com.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 i static
  • 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 nie abstract
  • 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:

  1. 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.
  2. 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.
  3. 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


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 poprawnie

  • Jednak, 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”.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow