Java Language
Kompilator Java - „javac”
Szukaj…
Uwagi
Komenda javac
służy do kompilacji plików źródłowych Java do plików kodu bajtowego. Pliki kodu bajtowego są niezależne od platformy. Oznacza to, że możesz skompilować kod na jednym sprzęcie i systemie operacyjnym, a następnie uruchomić kod na dowolnej platformie obsługującej Javę.
Polecenie javac
znajduje się w dystrybucjach Java Development Kit (JDK).
Kompilator Java i reszta standardowego zestawu narzędzi Java nakładają na kod następujące ograniczenia:
- Kod źródłowy jest przechowywany w plikach z sufiksem „.java”
- Kody bajtów są przechowywane w plikach z sufiksem „.class”
- W przypadku plików źródłowych i kodów bajtowych w systemie plików nazwy ścieżek plików muszą odzwierciedlać nazwy pakietów i klas.
Uwaga: Kompilatora javac
nie należy mylić z kompilatorem Just in Time (JIT), który kompiluje kody bajtowe do kodu natywnego.
Polecenie „javac” - pierwsze kroki
Prosty przykład
Zakładając, że „HelloWorld.java” zawiera następujące źródło Java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
(Aby uzyskać wyjaśnienie powyższego kodu, zobacz Pierwsze kroki w języku Java ).
Możemy skompilować powyższy plik za pomocą tego polecenia:
$ javac HelloWorld.java
Spowoduje to utworzenie pliku o nazwie „HelloWorld.class”, który możemy następnie uruchomić w następujący sposób:
$ java HelloWorld
Hello world!
Kluczowe punkty, na które należy zwrócić uwagę w tym przykładzie to:
- Źródłowa nazwa pliku „HelloWorld.java” musi być zgodna z nazwą klasy w pliku źródłowym ... czyli
HelloWorld
. Jeśli się nie zgadzają, pojawi się błąd kompilacji. - Nazwa pliku bajtu „HelloWorld.class” odpowiada nazwie klasy. Jeśli miałbyś zmienić nazwę „HelloWorld.class”, przy próbie uruchomienia wystąpiłby błąd.
- Podczas uruchamiania aplikacji Java za pomocą
java
podajesz nazwę klasy NIE nazwy pliku bajtecode.
Przykład z pakietami
Najbardziej praktyczny kod Java wykorzystuje pakiety do organizowania przestrzeni nazw dla klas i zmniejszenia ryzyka przypadkowej kolizji nazw klas.
Gdybyśmy chcieli zadeklarować klasę HelloWorld
w wywołaniu pakietu com.example
, „HelloWorld.java” zawierałoby następujące źródło Java:
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Ten plik kodu źródłowego musi być przechowywany w drzewie katalogów, którego struktura odpowiada nazwie pakietu.
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
Możemy skompilować powyższy plik za pomocą tego polecenia:
$ javac com/example/HelloWorld.java
Powoduje to utworzenie pliku o nazwie „com / example / HelloWorld.class”; tzn. po kompilacji struktura pliku powinna wyglądać następująco:
. # the current directory (for this example)
|
----com
|
----example
|
----HelloWorld.java
----HelloWorld.class
Następnie możemy uruchomić aplikację w następujący sposób:
$ java com.example.HelloWorld
Hello world!
Dodatkowe punkty, na które należy zwrócić uwagę w tym przykładzie to:
- Struktura katalogów musi pasować do struktury nazw pakietów.
- Po uruchomieniu klasy należy podać pełną nazwę klasy; tzn. „com.example.HelloWorld”, a nie „HelloWorld”.
- Nie musisz kompilować i uruchamiać kodu Java z bieżącego katalogu. Robimy to tylko dla ilustracji.
Kompilowanie wielu plików jednocześnie za pomocą „javac”.
Jeśli twoja aplikacja składa się z wielu plików kodu źródłowego (a większość tak!), Możesz je skompilować pojedynczo. Alternatywnie możesz skompilować wiele plików jednocześnie, wyświetlając nazwy ścieżek:
$ javac Foo.java Bar.java
lub używając funkcji wieloznacznej nazwy pliku powłoki poleceń ...
$ javac *.java
$ javac com/example/*.java
$ javac */**/*.java #Only works on Zsh or with globstar enabled on your shell
Spowoduje to skompilowanie wszystkich plików źródłowych Java w bieżącym katalogu, odpowiednio w katalogu „com / example” i rekurencyjnie w katalogach potomnych. Trzecią alternatywą jest podanie listy nazw plików źródłowych (i opcji kompilatora) jako pliku. Na przykład:
$ javac @sourcefiles
gdzie plik sourcefiles
zawiera:
Foo.java
Bar.java
com/example/HelloWorld.java
Uwaga: taki kod kompilacji jest odpowiedni dla małych jednoosobowych projektów i programów jednorazowych. Poza tym wskazane jest wybranie i użycie narzędzia do budowania Java. Alternatywnie, większość programistów używa Java IDE (np. NetBeans , eclipse , IntelliJ IDEA ), która oferuje wbudowany kompilator i przyrostowe budowanie „projektów”.
Często używane opcje „javac”
Oto kilka opcji polecenia javac
, które mogą być dla Ciebie przydatne
- Opcja
-d
ustawia katalog docelowy do zapisu plików „.class”. - Opcja
-sourcepath
ustawia ścieżkę wyszukiwania kodu źródłowego. - Opcja
-cp
lub-classpath
ustawia ścieżkę wyszukiwania w celu znalezienia zewnętrznych i wcześniej skompilowanych klas. Aby uzyskać więcej informacji na temat ścieżki klasy i sposobu jej określania, zobacz temat Ścieżka klasy . - Opcja
-version
wyświetla informacje o wersji kompilatora.
Pełniejsza lista opcji kompilatora zostanie opisana w osobnym przykładzie.
Bibliografia
Ostatecznym odniesieniem do komendy javac
jest strona podręcznika Oracle dla javac
.
Kompilowanie dla innej wersji Java
Język programowania Java (i jego środowisko wykonawcze) przeszedł wiele zmian od czasu jego wydania od czasu pierwszej publicznej wersji. Te zmiany obejmują:
- Zmiany w składni i semantyce języka programowania Java
- Zmiany w interfejsach API udostępnianych przez biblioteki klas standardowych Java.
- Zmiany w zestawie instrukcji Java (formacie kodu bajtowego) i formacie pliku klasy.
Z nielicznymi wyjątkami (na przykład słowo kluczowe enum
, zmiany niektórych klas „wewnętrznych” itp.) Zmiany te są kompatybilne wstecz.
- Program Java skompilowany przy użyciu starszej wersji zestawu narzędzi Java będzie działał na nowszej wersji platformy Java bez ponownej kompilacji.
- Program Java napisany w starszej wersji języka Java zostanie pomyślnie skompilowany z nowym kompilatorem Java.
Kompilowanie starej Java z nowszym kompilatorem
Jeśli musisz (ponownie) skompilować starszy kod Java na nowszej platformie Java, aby działał na nowszej platformie, zazwyczaj nie musisz podawać żadnych specjalnych flag kompilacji. W kilku przypadkach (np. Jeśli użyłeś enum
jako identyfikatora), możesz użyć opcji -source
, aby wyłączyć nową składnię. Na przykład, biorąc pod uwagę następującą klasę:
public class OldSyntax {
private static int enum; // invalid in Java 5 or later
}
do skompilowania klasy przy użyciu kompilatora Java 5 (lub nowszego) wymagane są:
$ javac -source 1.4 OldSyntax.java
Kompilowanie dla starszej platformy wykonawczej
Jeśli musisz skompilować Javę, aby działała na starszych platformach Java, najprostszym podejściem jest zainstalowanie JDK dla najstarszej wersji, którą chcesz obsługiwać, i użycie kompilatora JDK w twoich kompilacjach.
Możesz także skompilować przy użyciu nowszego kompilatora Java, ale są skomplikowane. Przede wszystkim należy spełnić ważne warunki wstępne:
- Kompilowany kod nie może wykorzystywać konstrukcji języka Java, które nie były dostępne w docelowej wersji języka Java.
- Kod nie może zależeć od standardowych klas Java, pól, metod itp., Które nie były dostępne na starszych platformach.
- Biblioteki stron trzecich, od których zależy kod, muszą być również zbudowane dla starszej platformy i dostępne w czasie kompilacji i wykonywania.
Biorąc pod uwagę, że warunki wstępne są spełnione, możesz ponownie skompilować kod dla starszej platformy za pomocą opcji -target
. Na przykład,
$ javac -target 1.4 SomeClass.java
skompiluje powyższą klasę w celu wygenerowania kodów bajtowych zgodnych z JVM Java 1.4 lub nowszym. (W rzeczywistości opcja -source
implikuje kompatybilny -target
, więc javac -source 1.4 ...
miałby ten sam efekt. Zależność między -source
i -target
jest opisana w dokumentacji Oracle).
Powiedziawszy to, jeśli użyjesz po prostu -target
lub -source
, nadal będziesz kompilował się ze standardowymi bibliotekami klas dostarczonymi przez JDK kompilatora. Jeśli nie będziesz ostrożny, możesz skończyć z klasami z poprawną wersją kodu bajtowego, ale z zależnościami od interfejsów API, które nie są dostępne. Rozwiązaniem jest użycie opcji -bootclasspath
. Na przykład:
$ javac -target 1.4 --bootclasspath path/to/java1.4/rt.jar SomeClass.java
skompiluje się z alternatywnym zestawem bibliotek wykonawczych. Jeśli kompilowana klasa ma (przypadkowe) zależności od nowszych bibliotek, spowoduje to błędy kompilacji.