Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

javac - компилятор языка программирования Java

РЕЗЮМЕ

        javac [ options ] [ sourcefiles ] [ classes ] [ @argfiles ]

Параметры могут быть в любом порядке.

options
Параметры командной строки.
sourcefiles
Один или более исходных файлов, которые будут скомпилированы (такие как MyClass.java).
classes
Один или более классов, которые будут обработаны для аннотаций (таких как MyPackage. MyClass).
@argfiles
Один или более файлов, который перечисляет опции и исходные файлы. -J опции не позволяются в этих файлах.

ОПИСАНИЕ

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

Есть два способа передать имена файлов исходного кода к javac:

Имена файлов исходного кода должны иметь .java суффиксы, имена файлов class должны иметь .class у суффиксов, и и источник и файлы class должны быть корневые имена, которые идентифицируют class. Например, class вызывают MyClass был бы записан в вызванном исходном файле MyClass.java и скомпилированный в байт-код файл class вызывают MyClass.class.

Внутренние определения class производят дополнительные файлы class. У этих файлов class есть имена, комбинирующие внутренние и внешние имена class, такой как MyClass$MyInnerClass.class.

Следует расположить исходные файлы в дереве каталогов, которое отражает их дерево пакета. Например, если Вы сохраняете все свои исходные файлы в / рабочем пространстве, исходном коде для com.mysoft.mypack.MyClass должен быть в /workspace/com/mysoft/mypack/MyClass.java.

По умолчанию компилятор помещает каждый файл class в тот же самый каталог как его исходный файл. Можно определить разделять целевой каталог с-d (см. Опции, ниже).

ОПЦИИ

У компилятора есть ряд стандартных опций, которые поддерживаются на текущей среде разработки и будут поддерживаться в будущих выпусках. Дополнительный набор нестандартных опций является определенным для текущей виртуальной машины и реализаций компилятора и является подверженным изменениям в будущем. Нестандартные опции начинаются с-X.

Стандартные Опции

-Akey [=value]
Опции, чтобы передать к процессорам аннотации. Они не интерпретируются javac непосредственно, но делаются доступными для использования отдельными процессорами. ключ должен быть одним или более идентификаторами, разделенными ".".
- путь cp или - путь пути к классу
Определите, где найти пользователя файлами class, и (дополнительно) процессорами аннотации и исходными файлами. Этот путь class переопределяет пользователя путь class в переменной окружения ПУТИ К КЛАССУ. Если ни ПУТЬ К КЛАССУ, - CP, ни - путь к классу не определяется, пользователь, путь class состоит из текущего каталога. См. Установку Пути к классу для большего количества деталей.

> Если-sourcepath опция не определяется, пользователь, путь class также ищется исходные файлы.

Если-processorpath опция не определяется, путь class также ищется процессоры аннотации.
-Djava.ext.dirs=directories
Переопределите расположение установленных расширений.
-Djava.endorsed.dirs=directories
Переопределите расположение подтвержденного пути стандартов.
Каталог-d
Установите целевой каталог для файлов class. Каталог должен уже существовать; javac не будет создавать это. Если class является частью пакета, javac помещает файл class в подкаталог, отражающий имя пакета, создавая каталоги как необходимый. Например, если Вы определяете-d/home/myclasses, и class вызывают com.mypackage.MyClass, тогда файл class вызывают /home/myclasses/com/mypackage/MyClass.class.

Если-d не определяется, javac помещает каждый class файлы в тот же самый каталог как исходный файл, от которого это было сгенерировано.

Отметьте: каталог, определенный-d, автоматически не добавляется к Вашему пользователю путь class.
- осуждение
Покажите описание каждого использования или переопределения осуждаемого элемента или class. Без - осуждение, javac показывает сводку исходных файлов, которые используют или переопределяют осуждаемые элементы или классы. - осуждение является сокращением для-Xlint:deprecation.
- кодирующий кодирование
Определите имя кодирования исходного файла, такой как EUC-JP and UTF-8. Если - кодирование не определяется, преобразователь значения по умолчанию платформы используется.
Каталоги-endorseddirs
Переопределите расположение подтвержденного пути стандартов.
Каталоги-extdirs
Переопределяет расположение ext каталог. Переменная каталогов является разделенным от двоеточия списком каталогов. Каждый архив JAR в указанных каталогах ищется файлы class. Все найденные архивы JAR являются автоматически частью пути class.

Если Вы кросс-компилируете (компиляция классов против классов начальной загрузки и расширения различной реализации платформы Java), эта опция определяет каталоги, которые содержат классы расширения. См. Опции Кросс-компиляции для получения дополнительной информации.
-g
Генерируйте всю отладочную информацию, включая локальные переменные. По умолчанию только информация о номере строки и исходном файле сгенерирована.
-g:none
Не генерируйте отладочную информацию.
-g: {список ключевого слова}
Генерируйте только некоторые виды отладочной информации, определенной списком разделенных запятой значений ключевых слов. Допустимые ключевые слова:
источник
Отладочная информация исходного файла
строки
Отладочная информация номера строки
вары
Отладочная информация локальной переменной
- справка
Напечатайте резюме стандартных опций.
- неявный: {class, ни один}
Управляет генерацией файлов class для неявно загруженных исходных файлов. Чтобы автоматически генерировать файлы class, используйте-implicit:class. Чтобы подавить генерацию файла class, используйте-implicit:none. Если эта опция не определяется, значение по умолчанию должно автоматически генерировать файлы class. В этом случае компилятор выпустит предупреждение, если какие-либо такие файлы class будут сгенерированы, также делая обработку аннотации. Предупреждение не будет выпущено, если эта опция будет установлена явно. См. Поиск Типов.
-Joption
Опцию передачи к средству запуска java вызывает javac. Например,-J-Xms48m устанавливает память запуска в 48 мегабайтов. Это - общее соглашение для-J, чтобы передать опции к базовому VM выполняющиеся приложения, записанные в Java.

Отметьте: ПУТЬ К КЛАССУ, - путь к классу,-bootclasspath, и-extdirs не определяет классы, используемые, чтобы выполнить javac. Игра с реализацией компилятора таким образом обычно бессмысленна и всегда опасна. Если Вы действительно должны сделать это, используйте-J опцию, чтобы пройти через опции к базовому средству запуска java.
-nowarn
Отключите предупреждающие сообщения. У этого есть то же самое значение как-Xlint:none.
-proc: {ни один, только}
Средства управления, делаются ли обработка аннотации и/или компиляция.-proc:none означает, что компиляция имеет место без обработки аннотации.-proc:only означает, что только обработка аннотации делается без любой последующей компиляции.
- процессор class1 [class2, class3...]
Имена процессоров аннотации, чтобы работать. Это обходит процесс открытия значения по умолчанию.
Путь-processorpath
Определите, где найти процессоры аннотации; если эта опция не будет использоваться, то путь class будет искаться процессоры.
dir-s
Определите каталог, куда поместить сгенерированные исходные файлы. Каталог должен уже существовать; javac не будет создавать это. Если class является частью пакета, компилятор помещает исходный файл в подкаталог, отражающий имя пакета, создавая каталоги как необходимый. Например, если Вы определяете-s/home/mysrc, и class вызывают com.mypackage.MyClass, тогда исходный файл будет помещен в /home/mysrc/com/mypackage/MyClass.java.
- исходный выпуск
Определяет версию принятого исходного кода. Следующие значения для выпуска позволяются:
1.3
Компилятор не поддерживает утверждения, обобщения, или другие функции языка, представленные после Java SE 1.3.
1.4
Компилятор принимает код, содержащий утверждения, которые были представлены в Java SE 1.4.
1.5
Компилятор принимает код, содержащий обобщения и другие функции языка, представленные в Java SE 5.
5
Синоним для 1.5.
1.6
Никакие изменения языка не были представлены в Java SE 6. Однако, о кодирующих ошибках в исходных файлах теперь сообщают как ошибки вместо предупреждений как в предыдущих выпусках Java SE.
6
Синоним для 1.6.
1.7
Компилятор принимает код с функциями, представленными в Java SE 7.
7
Синоним для 1.7.
1.8
Это - значение по умолчанию. Компилятор принимает код с функциями, представленными в Java SE 8.
8
Синоним для 1.8.
-sourcepath sourcepath
Определите путь исходного кода, чтобы искать определения интерфейса или class. Как с пользователем путь class, исходные записи пути разделяются двоеточиями (:) и могут быть каталоги, архивы JAR, или архивы ZIP. Если пакеты используются, локальный путь в пределах каталога или архива должен отразить имя пакета.

Отметьте: Классы, найденные через путь class, могут подвергнуться автоматической перекомпиляции, если их источники также находятся. См. Поиск Типов.
- многословный
Многословный вывод. Это включает информацию о каждом загруженном class и каждом скомпилированном исходном файле.
- версия
Информация о печатной версии.
-Werror
Оконечная компиляция, если предупреждения происходят.
-X
Информация о дисплее о нестандартных опциях и выходе.

Опции кросс-компиляции

По умолчанию классы компилируются против классов начальной загрузки и расширения платформы это javac, поставленный с. Но javac также поддерживает кросс-компиляцию, где классы компилируются против классов начальной загрузки и расширения различной реализации платформы Java. Важно использовать-bootclasspath и-extdirs, кросс-компилируя; см. Пример Кросс-компиляции ниже.

- целевая версия
Генерируйте файлы class, которые предназначаются для указанной версии VM. Файлы класса будут работать на указанной цели и на более поздних версиях, но не на более ранних версиях VM. Допустимые цели 1.1, 1.2, 1.3, 1.4, 1.5 (также 5), 1.6 (также 6), 1.7 (также 7), и 1.8 (также 8).

Значение по умолчанию для - цель зависит от значения - источник:

-bootclasspath bootclasspath
Кросс-скомпилируйте против указанного набора классов начальной загрузки. Как с пользователем путь class, загрузитесь, записи пути class разделяются двоеточиями (:) и могут быть каталоги, архивы JAR, или архивы ZIP.

Нестандартные Опции

-Xbootclasspath/p:path
Предварительно ожидайте к начальной загрузке путь class.
-Xbootclasspath/a:path
Добавьте к начальной загрузке путь class.
-Xbootclasspath/:path
Расположение переопределения начальной загрузки файлы class.
-Xlint
Включите всем рекомендуемым предупреждениям. В этом выпуске рекомендуется включение всем доступным предупреждениям.
-Xlint:all
Включите всем рекомендуемым предупреждениям. В этом выпуске рекомендуется включение всем доступным предупреждениям.
-Xlint:none
Отключите все предупреждения.
-Xlint:name
Позвольте предупредить имя. См. Предупреждения раздела, Которые Могут быть Включены или Отключены с-Xlint Опцией для списка предупреждений, которым можно включить с этой опцией.
- Xlint:-имя
Отключите предупреждение имени. См. Предупреждения раздела, Которые Могут быть Включены или Отключены с-Xlint Опцией для списка предупреждений, которые можно отключить с этой опцией.
Число-Xmaxerrs
Установите максимальное количество ошибок напечатать.
Число-Xmaxwarns
Установите максимальное количество предупреждений напечатать.
Имя файла-Xstdout
Отправьте сообщения компилятора именованному файлу. По умолчанию сообщения компилятора идут в System.err.
-Xprefer: {более новый, источник}
Определите, какой файл считать, когда и исходный файл и файл class находятся для типа. (См. Поиск Типов). Если-Xprefer:newer используется, он читает более новый из источника или файла class для типа (значение по умолчанию). Если-Xprefer:source опция используется, она читает исходный файл. Используйте-Xprefer:source, когда Вы хотите убедиться, что любые процессоры аннотации могут получить доступ к аннотациям, объявленным с политикой задержания SOURCE.
-Xpkginfo: {всегда, наследство, непустое}
Определите обработку информационных файлов пакета
-Xprint
Распечатайте текстовое представление указанных типов для того, чтобы отладить цели; не выполните ни обработку аннотации, ни компиляцию. Формат вывода может измениться.
-XprintProcessorInfo
Информация о печати, о которой аннотациях процессор просят обработать.
-XprintRounds
Информация о печати о начальной и последующей аннотации, обрабатывающей раунды.

Предупреждения, Которые Могут быть Включены или Отключены с-Xlint Опцией

Позвольте предупредить имя с опцией-Xlint:name, где имя является одним из следующих имен предупреждения. Точно так же можно отключить предупреждение имени с опцией - Xlint:-имя:

бросок
Предупредите о ненужных и избыточных бросках. Например:
String s = (String)"Hello!"
classfile
Предупредите о проблемах, связанных с classfile содержанием.
осуждение
Предупредите об использовании осуждаемых элементов. Например:
    java.util.Date myDate = new java.util.Date();
    int currentDay = myDate.getDay();
Метод java.util.Date.getDay был осужден начиная с JDK 1.1.
отправление-ann
Предупредите об элементах, которые документируются с @deprecated Javadoc комментируют, но не имеют a @Deprecated аннотация. Например:
  /**
   * @deprecated As of Java SE 7, replaced by {@link #newMethod()}
   */

  public static void deprecatedMethood() { }

  public static void newMethod() { }
divzero
Предупредите о подразделении постоянным целым числом 0. Например:
    int divideByZero = 42 / 0;
пустой
Предупредите о пустых операторах после if операторы. Например:
class E {
    void m() {
        if (true) ;
    }
}
fallthrough
Проверьте, что блоки switch для проваливаются случаи и предоставляют предупреждающее сообщение любому, которые находятся. Провалитесь случаи являются случаями в блоке switch кроме последнего случая в блоке, код которого не включает оператор break, позволяя выполнение кода "провалиться" от того случая до следующего случая. Например, код после метки case 1 в этом блоке switch не заканчивается оператором break:
switch (x) {
case 1:
       System.out.println("1");
       //  No break statement here.
case 2:
       System.out.println("2");
}
Если бы флаг -Xlint:fallthrough использовался, компилируя этот код, то компилятор испустил бы предупреждение о "возможном, проваливаются в случай," наряду с номером строки рассматриваемого случая.
наконец
Предупредите о finally пункты, которые не могут обычно завершаться. Например:
  public static int m() {
    try {
      throw new NullPointerException();
    } catch (NullPointerException e) {
      System.err.println("Caught NullPointerException.");
      return 1;
    } finally {
      return 0;
    }
  }
Компилятор генерирует предупреждение для finally блок в этом примере. Когда этот метод вызывают, он возвращает значение 0, нет 1. A finally блок всегда выполняется когда try блочные выходы. В этом примере, если управление передается catch, тогда выходы метода. Однако, finally блок должен быть выполнен, таким образом, он выполняется, даже при том, что управление было уже передано вне метода.
опции
Предупредите о проблемах, касающихся использования параметров командной строки. См. Пример Кросс-компиляции для примера этого вида предупреждения.
переопределения
Предупредите о проблемах относительно переопределений метода. Например, рассмотрите следующие два класса:
public class ClassWithVarargsMethod {
  void varargsMethod(String... s) { }
}
public class ClassWithOverridingMethod extends ClassWithVarargsMethod {
  @Override
  void varargsMethod(String[] s) { }
}
Компилятор генерирует предупреждение, подобное следующему:

warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod overrides varargsMethod(String...) in ClassWithVarargsMethod; overriding method is missing '...'

Когда компилятор встречается с varargs методом, он преобразовывает varargs формальный параметр в массив. В методе ClassWithVarargsMethod.varargsMethod, компилятор преобразовывает varargs формальный параметр String... s к формальному параметру String[] s, массив, который соответствует формальный параметр метода ClassWithOverridingMethod.varargsMethod. Следовательно, этот пример компиляции.
путь
Предупредите о недопустимых элементах пути и несуществующих каталогах пути на командной строке (относительно пути class, исходного пути, и других путей). Такие предупреждения не могут быть подавлены с @SuppressWarnings аннотация. Например:
javac -Xlint:path -classpath /nonexistentpath Example.java
обработка
Предупредите о проблемах относительно обработки аннотации. Компилятор генерирует это предупреждение, если у Вас есть class, у которого есть аннотация, и Вы используете процессор аннотации, который не может обработать тот тип исключения. Например, следующее является простым процессором аннотации:

Исходный файл AnnoProc.java:
import java.util.*;
import javax.annotation.processing.*;
import javax.lang.model.*;
import javax.lang.model.element.*;

@SupportedAnnotationTypes("NotAnno")
public class AnnoProc extends AbstractProcessor {
    public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv) {
        return true;
    }

    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latest();
    }
}
Исходный файл AnnosWithoutProcessors.java:
@interface Anno { }

@Anno
class AnnosWithoutProcessors { }
Следующие команды компилируют процессор аннотации AnnoProc, тогда выполните этот процессор аннотации против исходного файла AnnosWithoutProcessors.java:
% javac AnnoProc.java
% javac -cp . -Xlint:processing -processor AnnoProc -proc:only AnnosWithoutProcessors.java
Когда компилятор выполняет процессор аннотации против исходного файла AnnosWithoutProcessors.java, это генерирует следующее предупреждение:

warning: [processing] No processor claimed any of these annotations: Anno

Чтобы решить этот вопрос, можно переименовать аннотацию, определенную и используемую в class AnnosWithoutProcessors от Anno к NotAnno.
rawtypes
Предупредите об операциях непроверенных относительно необработанных типов. Следующий оператор генерирует a rawtypes предупреждение:
void countElements(List l) { ... }
Следующее не генерирует a rawtypes предупреждение:
void countElements(List<?> l) { ... }
List необработанный тип. Однако, List<?> неограниченный подстановочный знак параметризованный тип. Поскольку List параметризованный интерфейс, следует всегда определять его параметр типа. В этом примере, List формальный параметр определяется с неограниченным подстановочным знаком (?) как его формальный параметр типа, что означает что countElements метод может принять любое инстанцирование List интерфейс.
последовательный
Предупредите о без вести пропавших serialVersionUID определения на сериализуемых классах. Например:
public class PersistentTime implements Serializable
{
  private Date time;

   public PersistentTime() {
     time = Calendar.getInstance().getTime();
   }

   public Date getTime() {
     return time;
   }
}
Компилятор генерирует следующее предупреждение:

warning: [serial] serializable class PersistentTime has no definition of serialVersionUID

Если сериализуемый class явно не объявляет названное поле serialVersionUID, тогда время выполнения сериализации вычислит значение по умолчанию serialVersionUID значение, для что class, основанный на различных аспектах class, как описано в Спецификации Сериализации Объекта Java. Однако, строго рекомендуется, чтобы все сериализуемые классы явно объявили serialVersionUID значения, потому что процесс значения по умолчанию вычислений serialVersionUID долины очень чувствительны к деталям class, которые могут измениться в зависимости от реализаций компилятора, и могут таким образом привести к неожиданному InvalidClassExceptions во время десериализации. Поэтому, чтобы гарантировать непротиворечивое serialVersionUID значение через различные реализации компилятора Java, сериализуемый class должен объявить явное serialVersionUID значение.
статичный
Предупредите о проблемах, имеющих отношение к использованию статики. Например:
class XLintStatic {
    static void m1() { }
    void m2() { this.m1(); }
}
Компилятор генерирует следующее предупреждение:
warning: [static] static method should be qualified by type name, XLintStatic, instead of by an expression
Чтобы решить этот вопрос, можно вызвать статический метод m1 следующим образом:
XLintStatic.m1();
Альтернативно, можно удалить static ключевое слово от объявления метода m1.
попробовать
Предупредите о проблемах, имеющих отношение к использованию try блоки, включая операторы попытки с ресурсами. Например, предупреждение сгенерировано для следующего оператора потому что ресурс ac объявленный в try оператор не используется:
try ( AutoCloseable ac = getResource() ) {
    // do nothing
}
непроверенный
Дайте больше детали для предупреждений преобразования непроверенных, которые получают мандат Спецификацией языка Java. Например:
    List l = new ArrayList<Number>();
    List<String> ls = l;       // unchecked warning
Во время стирания типа, типов ArrayList<Number> и List<String> стать ArrayList и List, соответственно.

Переменная ls имеет параметризованный тип List<String>. Когда List ссылаемый l присваивается ls, компилятор генерирует предупреждение непроверенное; компилятор неспособен определить во время компиляции, и кроме того знает, что JVM не будет в состоянии определить во времени выполнения, если l обращается к a List<String> введите; это не делает. Следовательно, загрязнение "кучи" происходит.

Подробно, ситуация с загрязнением "кучи" происходит когда List объект l, чей статический тип List<Number>, присваивается другому List объект, ls, у этого есть различный статический тип, List<String>. Однако, компилятор все еще позволяет это присвоение. Это должно позволить этому присвоению сохранять назад совместимость с версиями Java SE, которые не поддерживают обобщения. Из-за стирания типа, List<Number> и List<String> оба становятся List. Следовательно, компилятор позволяет присвоение объекта l, у которого есть необработанный тип List, к объекту ls.
varargs
Предупредите об опасных использованиях переменных параметров (varargs) методы, в частности те, которые содержат non-reifiable параметры. Например:
public class ArrayBuilder {
  public static <T> void addToList (List<T> listArg, T... elements) {
    for (T x : elements) {
      listArg.add(x);
    }
  }
}
Компилятор генерирует следующее предупреждение для определения метода ArrayBuilder.addToList:
warning: [varargs] Possible heap pollution from parameterized vararg type T
Когда компилятор встречается с varargs методом, он преобразовывает varargs формальный параметр в массив. Однако, язык программирования Java не разрешает создание массивов параметризованных типов. В методе ArrayBuilder.addToList, компилятор преобразовывает varargs формальный параметр T... elements к формальному параметру T[] elements, массив. Однако, из-за стирания типа, компилятор преобразовывает varargs формальный параметр в Object[] elements. Следовательно, есть возможность загрязнения "кучи".

ФАЙЛЫ ПАРАМЕТРА КОМАНДНОЙ СТРОКИ

Чтобы сократить или упростить javac командную строку, можно определить один или более файлов, которые непосредственно содержат параметры javac команда (кроме -J опции). Это позволяет Вам создать javac команды любой длины на любой операционной системе.

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

Имена файлов в пределах файла параметра относительно текущего каталога, не расположения файла параметра. Подстановочные знаки (*) не позволяются в этих списках (такой что касается определения *.java). Использование символа '@', чтобы рекурсивно интерпретировать файлы не поддерживается. -J опции не поддерживаются, потому что их передают к средству запуска, которое не поддерживает файлы параметра.

Выполняясь javac, передайте в пути и имени каждого файла параметра с '@' ведущий символ. Когда javac встречается с параметром, начинающимся с символьного `@', он разворачивает содержание того файла в список параметров.

Пример - Единственный Файл Аргумента

Вы могли использовать единственный файл параметра, названный"argfile"чтобы содержать все javac параметры:

% javac @argfile

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

Пример - Два Файла Аргумента

Можно создать два файла параметра - один для javac опций и другого для исходных имен файлов: (Заметьте, что у следующих списков нет никаких символов продолжения строки.)

Создайте файл, названный"options"содержа:

     -d classes
     -g
     -sourcepath /java/pubs/ws/1.3/src/share/classes

Создайте файл, названный"classes"содержа:

     MyClass1.java
     MyClass2.java
     MyClass3.java

Вы тогда выполнили бы javac с:

  % javac @options @classes

Пример - Файлы Аргумента с Путями

У файлов параметра могут быть пути, но любые имена файлов в файлах относительно текущего рабочего каталога (нет path1 или path2):

% javac @path1/options @path2/classes

ОБРАБОТКА АННОТАЦИИ

javac непосредственно поддерживает обработку аннотации. API для процессоров аннотации определяется в javax.annotation.processing и javax.lang.model пакеты и подпакеты.

Краткий обзор обработки аннотации

Если обработка аннотации не отключается с-proc:none опцией, поиски компилятора никаких процессоров аннотации, которые доступны. Путь поиска может быть определен с-processorpath опцией; если это не дается, пользователь, путь class используется. Процессоры располагаются посредством названных конфигурационных файлов поставщика услуг META-INF/services/javax.annotation.processing.Processor на пути поиска. Такие файлы должны содержать имена любых процессоров аннотации, которые будут использоваться, перечисленные один на строку. Альтернативно, процессоры могут быть определены явно, используя - опция процессора.

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

Если какие-либо процессоры генерируют какие-либо новые исходные файлы, то другой раунд обработки аннотации произойдет: любые недавно сгенерированные исходные файлы будут отсканированы, и аннотации, обработанные как прежде. Любые процессоры, вызванные на предыдущие раунды, будут также вызваны на все последующие раунды. Это продолжается, пока никакие новые исходные файлы не сгенерированы.

После того, как раунд происходит, где никакие новые исходные файлы не сгенерированы, процессоры аннотации будут вызваны в один прошлый раз, чтобы дать им шанс завершить любую работу, которую они, возможно, должны сделать. Наконец, если-proc:only опция не используется, компилятор скомпилирует оригинал и все сгенерированные исходные файлы.

Неявно загруженные исходные файлы

Чтобы скомпилировать ряд исходных файлов, компилятор, возможно, должен неявно загрузить дополнительные исходные файлы. (См. Поиск Типов). Такие файлы в настоящий момент не подвергаются обработке аннотации. По умолчанию компилятор даст предупреждение, если обработка аннотации произошла, и любые неявно загруженные исходные файлы компилируются. См. - неявная опция для способов подавить предупреждение.

ПОИСК ТИПОВ

Компилируя исходный файл, компилятор часто нуждается в информации о типе, определение которого не появлялось в исходных файлах, данных на командной строке. Компилятор нуждается в информации о типе для каждого class или интерфейса, используемого, расширенного, или реализованный в исходном файле. Это включает классы и интерфейсы, не явно упомянутые в исходном файле, но которые предоставляют информацию посредством наследования.

Например, когда Вы разделяете java.applet на подклассы. Апплет, Вы также используете классы предка Апплета: java.awt. Панель, java.awt. Контейнер, java.awt. Компонент, и java.lang. Объект.

Когда компилятор нуждается в информации о типе, он ищет исходный файл или файл class, который определяет тип. Компилятор ищет файлы class сначала в классах начальной загрузки и расширения, затем в пользователе путь class (который по умолчанию является текущим каталогом). Пользователь путь class определяется, устанавливая переменную окружения ПУТИ К КЛАССУ или при использовании - параметр командной строки пути к классу. (Для получения дополнительной информации см. Установку Пути к классу).

Если Вы устанавливаете-sourcepath опцию, компилятор ищет обозначенный путь исходные файлы; иначе компилятор ищет пользователя путь class и файлы class и исходные файлы.

Можно определить различные классы начальной загрузки или расширения с-bootclasspath и-extdirs опциями; см. Опции Кросс-компиляции ниже.

Успешный поиск типа может произвести файл class, исходный файл, или обоих. Если оба находятся, можно использовать-Xprefer опцию, чтобы сообщить компилятору, чтобы использовать. Если более новый дается, компилятор будет использовать более новые из этих двух файлов. Если источник будет дан, то он будет использовать исходный файл. Значение по умолчанию более ново.

Если поиск типа найдет исходный файл для необходимого типа, или отдельно, или в результате установки для-Xprefer, то компилятор считает исходный файл, чтобы получить информацию, в которой это нуждается. Кроме того, это будет значением по умолчанию компилировать исходный файл также. Можно использовать - неявная опция, чтобы определить поведение. Если ни один не будет дан, то никакие файлы class не будут сгенерированы для исходного файла. Если class будет дан, то файлы class будут сгенерированы для исходного файла.

Компилятор, возможно, не обнаруживает потребность в некоторой информации о типе, пока обработка аннотации не полна. Если информация о типе находится в исходном файле и нет - неявная опция дается, компилятор даст предупреждение, что файл компилируется, не будучи подвергающимся обработке аннотации. Чтобы отключить предупреждение, любой определяет файл на командной строке (так, чтобы это подверглось обработке аннотации), или используйте - неявная опция, чтобы определить, должны ли файлы class быть сгенерированы для таких исходных файлов.

ПРОГРАММИРУЕМЫЙ ИНТЕРФЕЙС

javac поддерживает новый API Компилятора Java, определенный классами и интерфейсами в javax.tools пакет.

Пример

Чтобы выполнить компиляцию, используя параметры, поскольку Вы дали бы на командной строке, можно использовать следующее:

JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
int rc = javac.run(null, null, null, args);

Это запишет любую диагностику в поток стандартного вывода, и возвратит код выхода, который javac дал бы когда вызвано из командной строки.

Можно использовать другие методы на javax.tools.JavaCompiler взаимодействуйте через интерфейс, чтобы обработать диагностику, управление, где файлы читаются из и пишутся и так далее.

Старый Интерфейс

Отметьте: Этот API сохраняется для назад совместимости только; весь новый код должен использовать API Компилятора Java, описанный выше.

com.sun.tools.javac.Main class обеспечивает два статических метода, чтобы вызвать компилятор из программы:

public static int compile(String[] args);
public static int compile(String[] args, PrintWriter out);

args параметр представляет любой из параметров командной строки, которые обычно передавали бы к javac программе и обрисовываются в общих чертах в вышеупомянутом разделе Резюме.

out параметр указывает, где диагностический вывод компилятора направляется.

Возвращаемое значение эквивалентно значению выхода от javac.

Отметьте, что все другие классы и методы, найденные в пакете, имя которого запускается с com.sun.tools.javac (неофициально известный как подпакеты com.sun.tools.javac) являются строго внутренними и подлежат изменению в любое время.

ПРИМЕРЫ

Компиляция Простой Программы

Один исходный файл, Hello.java, определяет class, названный поздравлениями. Привет. greetings каталог является каталогом пакета и для исходного файла и для файла class и от текущего каталога. Это позволяет нам использовать пользователя значения по умолчанию путь class. Это также делает ненужным определить разделять целевой каталог с-d.

% ls
greetings/
% ls greetings
Hello.java
% cat greetings/Hello.java
package greetings;

public class Hello {
    public static void main(String[] args) {
        for (int i=0; i < args.length; i++) {
            System.out.println("Hello " + args[i]);
        }
    }
}
% javac greetings/Hello.java
% ls greetings
Hello.class   Hello.java
% java greetings.Hello World Universe Everyone
Hello World
Hello Universe
Hello Everyone

Компиляция Многократных Исходных файлов

Этот пример компилирует все исходные файлы в пакете greetings.

% ls
greetings/
% ls greetings
Aloha.java         GutenTag.java      Hello.java         Hi.java
% javac greetings/*.java
% ls greetings
Aloha.class         GutenTag.class      Hello.class         Hi.class
Aloha.java          GutenTag.java       Hello.java          Hi.java

Определение Пользовательского Пути к классу

Изменив один из исходных файлов в предыдущем примере, мы перекомпилировали это:

% pwd
/examples
% javac greetings/Hi.java

С тех пор greetings.Hi обращается к другим классам в greetings пакет, компилятор должен найти эти другие классы. Пример выше работ, потому что наш пользователь значения по умолчанию путь class, оказывается, каталог, содержащий каталог пакета. Но предположите, что мы хотим перекомпилировать этот файл и не беспокойство, о котором каталоге мы находимся в? Затем мы должны добавить /examples пользователю путь class. Мы можем сделать это установкой CLASSPATH, но здесь мы будем использовать - опция пути к классу.

% javac -classpath /examples /examples/greetings/Hi.java

Если мы изменяемся greetings.Hi снова, чтобы использовать утилиту баннера, та утилита также должна быть доступной через пользователя путь class.

% javac -classpath /examples:/lib/Banners.jar \
            /examples/greetings/Hi.java

Выполнить class в greetings, мы нуждаемся в доступе оба к greetings и к классам это использует.

% java -classpath /examples:/lib/Banners.jar greetings.Hi

Разделение Исходных файлов и Файлов Класса

Часто имеет смысл сохранять исходные файлы и файлы class в отдельных каталогах, особенно на крупных проектах. Мы используем-d, чтобы указать на отдельное место назначения файла class. Так как исходные файлы не находятся в пользователе путь class, мы используем-sourcepath, чтобы помочь компилятору найти их.

% ls
classes/  lib/      src/
% ls src
farewells/
% ls src/farewells
Base.java      GoodBye.java
% ls lib
Banners.jar
% ls classes
% javac -sourcepath src -classpath classes:lib/Banners.jar \
            src/farewells/GoodBye.java -d classes
% ls classes
farewells/
% ls classes/farewells
Base.class      GoodBye.class

Отметьте: компилятор скомпилирован src/farewells/Base.java, даже при том, что мы не определяли это на командной строке. Чтобы проследить автоматические компиляции, используйте - многословная опция.

Пример кросс-компиляции

Следующий пример использует javac, чтобы скомпилировать код, который будет работать на 1.6 VM.

% javac -source 1.6 -target 1.6 -bootclasspath jdk1.6.0/lib/rt.jar \
            -extdirs "" OldCode.java

-source 1.6 опция определяет что версия 1.6 (или 6) языка программирования Java использоваться, чтобы скомпилировать OldCode.java. Опция - предназначается для 1.6 опций, гарантирует, что сгенерированные файлы class будут совместимыми с 1.6 VMs. Отметьте, что в большинстве случаев, значение - целевая опция является значением - исходная опция; в этом примере можно опустить - целевая опция.

Следует определить-bootclasspath опцию, чтобы определить корректную версию классов начальной загрузки ( rt.jar библиотека). В противном случае компилятор генерирует предупреждение:

% javac -source 1.6 OldCode.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6

Если Вы не определите корректную версию классов начальной загрузки, то компилятор будет использовать старые правила языка (в этом примере, это будет использовать версию 1.6 языка программирования Java), объединенный с новыми классами начальной загрузки, которые могут привести к файлам class, которые не работают над более старой платформой (в этом случае, Java SE 6), потому что ссылка на несуществующие методы может быть включена.

СМ. ТАКЖЕ


Oracle и/или его филиалы Авторское право © 1993, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами