Поиск…


замечания

Команда javac используется для компиляции исходных файлов Java в файлы байт-кода. Файлы байт-кода не зависят от платформы. Это означает, что вы можете скомпилировать свой код на одном оборудовании и операционной системе, а затем запустить код на любой другой платформе, поддерживающей Java.

Команда javac включена в дистрибутивы Java Development Kit (JDK).

Компилятор Java и остальная часть стандартной инструментальной привязки Java накладывают следующие ограничения на код:

  • Исходный код хранится в файлах с суффиксом ".java"
  • Байткоды хранятся в файлах с суффиксом «.class»
  • Для файлов исходного и байт-кода в файловой системе имена файлов должны соответствовать именам пакетов и классов.

Примечание. Компилятор javac не следует путать с компилятором Just in Time (JIT), который компилирует байт-коды в собственный код.

Команда «javac» - начало работы

Простой пример

Предполагая, что «HelloWorld.java» содержит следующий источник Java:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

(Для объяснения приведенного выше кода обратитесь к началу работы с языком Java .)

Мы можем скомпилировать вышеуказанный файл, используя следующую команду:

$ javac HelloWorld.java 

Это создает файл HelloWorld.class, который мы можем запустить следующим образом:

$ java HelloWorld
Hello world!

Ключевыми моментами этого примера являются:

  1. Исходное имя файла «HelloWorld.java» должно соответствовать имени класса в исходном файле ... который является HelloWorld . Если они не совпадают, вы получите ошибку компиляции.
  2. Имя файла байта «HelloWorld.class» соответствует имени класса. Если вы хотите переименовать «HelloWorld.class», вы получите сообщение об ошибке при попытке запустить его.
  3. При запуске Java-приложения с использованием java вы указываете имя класса NOT байтовое имя файла.

Пример с пакетами

Наиболее практичный Java-код использует пакеты для организации пространства имен для классов и снижения риска случайного столкновения имени класса.

Если бы мы хотели объявить класс HelloWorld в вызове com.example пакета, «HelloWorld.java» будет содержать следующий источник Java:

package com.example;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

Этот файл исходного кода должен храниться в дереве каталогов, структура которого соответствует названию пакета.

.    # the current directory (for this example)
|
 ----com
     |
      ----example
          |
           ----HelloWorld.java

Мы можем скомпилировать вышеуказанный файл, используя следующую команду:

$ javac com/example/HelloWorld.java 

Это создает файл с именем «com / example / HelloWorld.class»; т.е. после компиляции структура файла должна выглядеть так:

.    # the current directory (for this example)
|
 ----com
     |
      ----example
          |
           ----HelloWorld.java
           ----HelloWorld.class

Затем мы можем запустить приложение следующим образом:

$ java com.example.HelloWorld
Hello world!

Дополнительные моменты, которые следует отметить из этого примера:

  1. Структура каталогов должна соответствовать структуре имени пакета.
  2. Когда вы запускаете класс, должно быть предоставлено полное имя класса; т.е. «com.example.HelloWorld» не «HelloWorld».
  3. Вам не нужно компилировать и запускать код Java из текущего каталога. Мы просто делаем это здесь для иллюстрации.

Компиляция сразу нескольких файлов с помощью javac.

Если ваше приложение состоит из нескольких файлов исходного кода (и большинство из них!), Вы можете скомпилировать их по одному. Кроме того, вы можете скомпилировать несколько файлов одновременно, указав пути:

$ javac Foo.java Bar.java

или используя функциональные возможности подстановочных файлов в командной оболочке.

$ javac *.java
$ javac com/example/*.java
$ javac */**/*.java #Only works on Zsh or with globstar enabled on your shell

Это скомпилирует все исходные файлы Java в текущем каталоге, в каталоге «com / example» и рекурсивно в дочерних каталогах соответственно. Третьей альтернативой является предоставление списка исходных имен файлов (и параметров компилятора) в виде файла. Например:

$ javac @sourcefiles

где файл sourcefiles файлов содержит:

Foo.java
Bar.java
com/example/HelloWorld.java

Примечание: компиляция такого кода подходит для небольших проектов с одним человеком и для одноразовых программ. Кроме того, рекомендуется выбирать и использовать инструмент построения Java. В качестве альтернативы, большинство программистов используют Java IDE (например, NetBeans , eclipse , IntelliJ IDEA ), которая предлагает встроенный компилятор и инкрементное построение «проектов».

Обычно используемые опции «javac»

Вот несколько вариантов команды javac , которые могут быть вам полезны

  • Параметр -d устанавливает целевой каталог для записи файлов «.class».
  • Параметр -sourcepath задает путь поиска исходного кода.
  • -cp или -classpath опция устанавливает путь поиска для нахождения внешних и ранее скомпилированных классов. Для получения дополнительной информации о пути к классам и о том, как его указать, обратитесь к теме Classpath .
  • Параметр -version выводит информацию о версии компилятора.

Более полный список параметров компилятора будет описан в отдельном примере.

Рекомендации

Определяющей ссылкой для команды javac является страница руководства Oracle для javac .

Компиляция для другой версии Java

Язык программирования Java (и его время выполнения) претерпел многочисленные изменения со времени его выпуска с момента его первоначального публичного выпуска. Эти изменения включают:

  • Изменения в синтаксисе и семантике языка программирования Java
  • Изменения в API, предоставляемые стандартными библиотеками классов Java.
  • Изменения в наборе команд Java (байт-код) и в формате classfile.

За очень немногими исключениями (например, ключевое слово enum , изменения в некоторых «внутренних» классах и т. Д.) Эти изменения обратно совместимы.

  • Java-программа, которая была скомпилирована с использованием старой версии инструментальной Java-технологии, будет работать на платформе Java новой версии без перекомпиляции.
  • Программа Java, написанная в старой версии Java, будет успешно скомпилирована с новым компилятором Java.

Компиляция старой Java с более новым компилятором

Если вам нужно (повторно) скомпилировать старый Java-код на более новой платформе Java для запуска на новой платформе, вам вообще не нужно давать какие-либо специальные флаги компиляции. В некоторых случаях (например, если вы использовали enum как идентификатор), вы можете использовать параметр -source для отключения нового синтаксиса. Например, учитывая следующий класс:

public class OldSyntax {
    private static int enum;  // invalid in Java 5 or later
}

для компиляции класса с использованием компилятора Java 5 (или более поздней) требуется следующее:

$ javac -source 1.4 OldSyntax.java

Компиляция для старой платформы выполнения

Если вам нужно скомпилировать Java для работы на старых платформах Java, самый простой подход - установить JDK для самой старой версии, которую вам нужно поддерживать, и использовать этот компилятор JDK в своих сборках.

Вы также можете скомпилировать новый Java-компилятор, но сложны. Прежде всего, есть некоторые важные предпосылки, которые должны быть выполнены:

  • Код, который вы компилируете, не должен содержать конструкторы языка Java, которые не были доступны в версии Java, на которую вы нацеливаете.
  • Код не должен зависеть от стандартных классов Java, полей, методов и т. Д., Которые не были доступны на старых платформах.
  • Сторонние библиотеки, которые зависят от кода, также должны быть созданы для старой платформы и доступны во время компиляции и времени выполнения.

Учитывая, что выполнены предварительные условия, вы можете перекомпилировать код для более старой платформы, используя параметр -target . Например,

$ javac -target 1.4 SomeClass.java

скомпилирует вышеуказанный класс для создания байт-кодов, совместимых с Java 1.4 или более поздней версией JVM. (Фактически параметр -source подразумевает совместимый -target , поэтому javac -source 1.4 ... будет иметь тот же эффект. Связь между -source и -target описана в документации Oracle.)

Сказав это, если вы просто используете -target или -source , вы все равно будете компилировать против стандартных библиотек классов, предоставляемых JDK компилятора. Если вы не будете осторожны, вы можете получить классы с правильной версией байт-кода, но с зависимостями от API, которые недоступны. Решение состоит в использовании опции -bootclasspath . Например:

$ javac -target 1.4 --bootclasspath path/to/java1.4/rt.jar SomeClass.java

будет скомпилирован против альтернативного набора библиотек времени исполнения. Если скомпилированный класс имеет (случайные) зависимости от более новых библиотек, это даст вам ошибки компиляции.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow