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:

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

  1. Struktura katalogów musi pasować do struktury nazw pakietów.
  2. Po uruchomieniu klasy należy podać pełną nazwę klasy; tzn. „com.example.HelloWorld”, a nie „HelloWorld”.
  3. 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.



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