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

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

РЕЗЮМЕ

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

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

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

ОПИСАНИЕ

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

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

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

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

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

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

ОПЦИИ

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

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

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

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

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

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

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

Если Вы кросс-компилируете (компиляция классов против классов начальной загрузки и расширения различной реализации платформы Java), эта опция определяет каталоги, которые содержат классы расширения. См. Опции Кросс-компиляции для получения дополнительной информации.
-g
Генерируйте всю отладочную информацию, включая локальные переменные. По умолчанию только информация о номере строки и исходном файле сгенерирована.
-g:none
Не генерируйте отладочную информацию.
-g: {список ключевого слова}
Генерируйте только некоторые виды отладочной информации, определенной списком разделенных запятой значений ключевых слов. Допустимые ключевые слова:
источник
Отладочная информация исходного файла
строки
Отладочная информация номера строки
вары
Отладочная информация локальной переменной
- справка
Напечатайте резюме стандартных опций.
- неявный: {класс, ни один}
Управляет генерацией файлов класса для неявно загруженных исходных файлов. Чтобы автоматически генерировать файлы класса, используйте-implicit:class. Чтобы подавить генерацию файла класса, используйте-implicit:none. Если эта опция не определяется, значение по умолчанию должно автоматически генерировать файлы класса. В этом случае компилятор выпустит предупреждение, если какие-либо такие файлы класса будут сгенерированы, также делая обработку аннотации. Предупреждение не будет выпущено, если эта опция будет установлена явно. См. Поиск Типов.
-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
Определите, где найти процессоры аннотации; если эта опция не будет использоваться, то путь к классу будет искаться процессоры.
dir-s
Определите каталог, куда поместить сгенерированные исходные файлы. Каталог должен уже существовать; javac не будет создавать это. Если класс является частью пакета, компилятор помещает исходный файл в подкаталог, отражающий имя пакета, создавая каталоги как необходимый. Например, если Вы определяете-s/home/mysrc, и класс вызывают com.mypackage.MyClass, тогда исходный файл будет помещен в /home/mysrc/com/mypackage/MyClass.java.
- исходный выпуск
Определяет версию принятого исходного кода. Следующие значения для выпуска позволяются:
1.3
Компилятор не поддерживает утверждения, обобщения, или другие функции языка, представленные после JDK 1.3.
1.4
Компилятор принимает код, содержащий утверждения, которые были представлены в JDK 1.4.
1.5
Компилятор принимает код, содержащий обобщения и другие функции языка, представленные в JDK 5.
5
Синоним для 1.5.
1.6
Это - значение по умолчанию. Никакие изменения языка не были представлены в Java SE 6. Однако, о кодирующих ошибках в исходных файлах теперь сообщают как ошибки, вместо предупреждений, как ранее.
6
Синоним для 1.6.
1.7
Компилятор принимает код с функциями, представленными в JDK 7.
7
Синоним для 1.7.
-sourcepath sourcepath
Определите путь исходного кода, чтобы искать класс или интерфейсные определения. Как с пользовательским путем к классу, исходные записи пути разделяются двоеточиями (:) и могут быть каталоги, архивы JAR, или архивы ZIP. Если пакеты используются, локальный путь в пределах каталога или архива должен отразить имя пакета.

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

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

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

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

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

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

-Xbootclasspath/p:path
Предварительно ожидайте к пути к классу начальной загрузки.
-Xbootclasspath/a:path
Добавьте к пути к классу начальной загрузки.
-Xbootclasspath/:path
Расположение переопределения файлов класса начальной загрузки.
-Xlint
Включите всем рекомендуемым предупреждениям. В этом выпуске рекомендуется включение всем доступным предупреждениям.
-Xlint:all
Включите всем рекомендуемым предупреждениям. В этом выпуске рекомендуется включение всем доступным предупреждениям.
-Xlint:none
Отключите все предупреждения.
-Xlint:name
Позвольте предупредить имя. См. Предупреждения раздела, Которые Могут быть Включены или Отключены с-Xlint Опцией для списка предупреждений, которым можно включить с этой опцией.
- Xlint:-имя
Имя предупреждения отключения. См. Предупреждения раздела, Которые Могут быть Включены или Отключены с-Xlint Опцией для списка предупреждений, которые можно отключить с этой опцией.
Число-Xmaxerrs
Установите максимальное количество ошибок напечатать.
Число-Xmaxwarns
Установите максимальное количество предупреждений напечатать.
Имя файла-Xstdout
Отправьте сообщения компилятора именованному файлу. По умолчанию сообщения компилятора идут в System.err.
-Xprefer: {более новый, источник}
Определите, какой файл считать, когда и исходный файл и файл класса находятся для типа. (См. Поиск Типов). Если-Xprefer:newer используется, он читает более новый из источника или файла класса для типа (значение по умолчанию). Если-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. Следовательно, этот пример компиляции.
путь
Предупредите о недопустимых элементах пути и несуществующих каталогах пути на командной строке (относительно пути к классу, исходного пути, и других путей). Такие предупреждения не могут быть подавлены с @SuppressWarnings аннотация. Например:
javac -Xlint:path -classpath /nonexistentpath Example.java
обработка
Предупредите о проблемах относительно обработки аннотации. Компилятор генерирует это предупреждение, если у Вас есть класс, у которого есть аннотация, и Вы используете процессор аннотации, который не может обработать тот тип исключения. Например, следующее является простым процессором аннотации:

Исходный файл 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

Чтобы решить этот вопрос, можно переименовать аннотацию, определенную и используемую в классе 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

Если сериализуемый класс явно не объявляет названное поле serialVersionUID, тогда время выполнения сериализации вычислит значение по умолчанию serialVersionUID значение для того класса, основанного на различных аспектах класса, как описано в Спецификации Сериализации Объекта Java. Однако, строго рекомендуется, чтобы все сериализуемые классы явно объявили serialVersionUID значения, потому что процесс по умолчанию вычислений serialVersionUID долины очень чувствительны к деталям класса, которые могут измениться в зависимости от реализаций компилятора, и могут таким образом привести к неожиданному InvalidClassExceptions во время десериализации. Поэтому, чтобы гарантировать непротиворечивое serialVersionUID значение через различные реализации компилятора Java, сериализуемый класс должен объявить явное 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 опцией; если это не дается, пользовательский путь к классу используется. Процессоры располагаются посредством названных конфигурационных файлов поставщика услуг META-INF/services/javax.annotation.processing.Processor на пути поиска. Такие файлы должны содержать имена любых процессоров аннотации, которые будут использоваться, перечисленные один на строку. Альтернативно, процессоры могут быть определены явно, используя - опция процессора.

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

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

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

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

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

ПОИСК ТИПОВ

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

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

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

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

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

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

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

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

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

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 класс обеспечивает два статических метода, чтобы вызвать компилятор из программы:

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, определяет класс, названный поздравлениями. Привет. greetings каталог является каталогом пакета и для исходного файла и для файла класса и от текущего каталога. Это позволяет нам использовать пользовательский путь к классу по умолчанию. Это также делает ненужным определить разделять целевой каталог с-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 пакет, компилятор должен найти эти другие классы. Пример выше работ, потому что наш пользовательский путь к классу по умолчанию, оказывается, каталог, содержащий каталог пакета. Но предположите, что мы хотим перекомпилировать этот файл и не беспокойство, о котором каталоге мы находимся в? Затем мы должны добавить /examples к пользовательскому пути к классу. Мы можем сделать это установкой CLASSPATH, но здесь мы будем использовать - опция пути к классу.

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

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

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

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

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

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

Часто имеет смысл сохранять исходные файлы и файлы класса в отдельных каталогах, особенно на крупных проектах. Мы используем-d, чтобы указать на отдельное место назначения файла класса. Так как исходные файлы не находятся в пользовательском пути к классу, мы используем-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 опций, гарантирует, что сгенерированные файлы класса будут совместимыми с 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), объединенный с новыми классами начальной загрузки, которые могут привести к файлам класса, которые не работают над более старой платформой (в этом случае, Java SE 6), потому что ссылка на несуществующие методы может быть включена.

СМ. ТАКЖЕ


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