В состав модулей JDT входит дополняющий и пакетный компилятор Java для создания из исходного кода файлов .class Java. Для этого компилятора нет специального API; он устанавливается как компоновщик для проектов Java. Компиляция запускается с помощью стандартных механизмов компоновки, предусмотренных в платформе.
Механизм компоновки, предоставляемый платформой, подробно описан в разделе Дополняющие компоновщики проектов .
Файлы исходного кода Java в проекте можно компилировать программным образом с помощью API компоновки.
IProject myProject; IProgressMonitor myProgressMonitor; myProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, myProgressMonitor);
Этот интерфейс вызывает для проекта Java дополняющий компоновщик Java (вместе с любыми другими дополняющими компоновщиками, которые были добавлены в спецификацию компоновки этого проекта). Генерированные файлы .class помещаются в заданную папку вывода. В эту же папку копируются дополнительные файлы ресурсов.
В случае полной пакетной компоновки файлы .class могут быть удалены из папки вывода, чтобы избежать включения в проект устаревших файлов. Это можно сделать с помощью опции компоновщика JDT Core (CORE_JAVA_BUILD_CLEAN_OUTPUT_FOLDER). Значение по умолчанию для этой опции вызывает очистку папок вывода. Если эта опция не сброшена, необходимо убедиться, что все файлы .class, для которых нет соответствующих файлов исходного кода, помещены в пути к классам в отдельную папку файлов классов, а не в папку вывода.
Для дополняющих и пакетных компоновщиков можно настроить другие опции, которые
определяют, какие ресурсы копируются в папку вывода. В приведенном ниже примере
показано, как настроить фильтр ресурсов, чтобы в папку вывода не копировались файлы с
именами, оканчивающимися на '.ignore', и папки 'META-INF':
Hashtable options = JavaCore.getOptions();
options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/");
JavaCore.setOptions(options);
Имена файлов фильтруются, если они совпадают с одним из указанных шаблонов. Папки фильтруются, если их имена совпадают с одним из указанных имен папок, которое заканчивается разделителем элементов пути.
Дополняющие и пакетные компоновщики можно настроить так, чтобы при наличии ошибок в файле .classpath они генерировали только одну ошибку. Эта опция устанавливается по умолчанию и позволяет исключить возникновение многочисленных ошибок. Полный список опций, связанных с компоновщиком, и их значений по умолчанию приведен в разделе Опции компоновщика JDT Core.
Для настройки компилятора можно также использовать опции JavaCore. Например, можно определить уровень серьезности, который должен применяться для различных типов неполадок, обнаруженных при компиляции. Полный список опций, связанных с компоновщиком, и их значений по умолчанию приведен в разделе Опции компилятора JDT Core.
При программной настройке опций компоновщика и компилятора необходимо определить область действия опции. Например, настройка фильтра ресурса может применяться только к отдельному объекту. В следующем примере задается тот же фильтр ресурса, что и в предыдущем примере, однако в данном случае он применяется только к отдельному проекту.
Hashtable options = myProject.getOptions(false); // получить только опции, установленные в проекте options.put(JavaCore.CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, "*.ignore,META-INF/"); myProject.setOptions(options);
Пакетный компилятор входит в состав внутренних классов модуля JDT/Core, а именно в файл jdtcore.jar в каталоге plugins/org.eclipse.jdt.core. Имя класса - org.eclipse.jdt.internal.compiler.batch.Main.
java -classpath org.eclipse.jdt.core_3.1.1.jar org.eclipse.jdt.internal.compiler.batch.Main
-classpath rt.jar A.java
или
java -jar org.eclipse.jdt.core_3.1.1.jar -classpath rt.jar A.java
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
Метод compile(String)
служит для вызова пакетного компилятора в приложении на Java.
Вместо
org.eclipse.jdt.internal.compiler.batch.Main.main(new
String[] {"-classpath", "rt.jar", "A.java"});
укажите org.eclipse.jdt.internal.compiler.batch.Main.compile("-classpath
rt.jar A.java");
Рекомендуемые опции выделены оранжевым фоном.
Имя | Формат | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Опции Classpath | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-bootclasspath <dir 1>;<dir 2>;...;<dir P> | Список каталогов или файлов JAR для первоначальной загрузки файлов классов в компилятор. По умолчанию используются библиотеки рабочей виртуальной машины. Записи разделяются символов разделителя путей платформы. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-cp -classpath <dir 1>;<dir 2>;...;<dir P> |
Список каталогов или файлов JAR, служащих для компиляции исходных файлов. Значение по умолчанию - значение свойства "java.class.path". Записи разделяются символов разделителя путей платформы. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-extdirs <dir 1>;<dir 2>;...;<dir P> | Список каталогов с файлами расширений zip и jar. Записи разделяются символов разделителя путей платформы. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-sourcepath <dir 1>;<dir 2>;...;<dir P> | Список каталогов исходных файлов. Записи разделяются символов разделителя путей платформы. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-d <dir 1>|none | Расположение создаваемых файлов .class. Если оно не указано, структура каталогов пакетов не создается. Для того чтобы выключить создание файлов .class, укажите -d none. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-encoding <кодировка> | Кодировка исходных файлов по умолчанию. Можно также задавать кодировку для отдельных файлов, снабжая файлы или каталоги суффиксом [encoding <кодировка>]). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Опции совместимости | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-target 1.1|1.2|1.3|1.4|1.5|5|5.0 | Параметры цели файлов .class.
Допустимые значения:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.3 | Уровень совместимости 1.3. Подразумевает -source 1.3 -target 1.1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.4 | Уровень совместимости 1.4 (значение по умолчанию). Подразумевает -source 1.3 -target 1.2. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1.5 | Уровень совместимости 1.5. Подразумевает -source 1.5 -target 1.5. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-source 1.3|1.4|1.5|5|5.0 | Уровень исходного кода для компилятора. Допустимые значения:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Опции предупреждений | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-warn:allDeprecation |
Уровень предупреждений. Например, -warn:unusedLocals,deprecation Красным выделены значения по умолчанию.
-warn:<предупреждения через ,> включить перечисленные предупреждения -warn:+<предупреждения через ,> включить дополнительные предупреждения -warn:-<предупреждения через ,> выключить указанные предупреждения
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-nowarn | Не показывать предупреждения (аналогично -warn:none) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-deprecation | Аналогично -warn:deprecation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Опции отладки | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-g[:none|:lines,vars,source] | Уровень атрибутов отладки
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-preserveAllLocals | Явным образом указать компилятору необходимость сохранения локальных переменных для отладки. При отсутствии этого атрибута компилятор удалит все локальные переменные. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Дополнительные опции | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@<file> | Загрузить аргументы командной строки из файла | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-maxProblems <n> | Максимальное число ошибок в модуле компиляции (по умолчанию 100) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-log <имя-файла> | Файл протокола для вывода компилятора. Полезная опция при отладке пакетного компилятора для получения файла со всеми ошибками и предупреждениями пакетной компоновки. Если расширение - это .xml, файл протокола будет создан в формате xml. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-proceedOnError | Продолжить компиляцию при возникновении ошибок, выводя файлы классов с ошибками в методах или типах. Рекомендуется только в том случае, если требуется запустить приложение даже при наличии оставшихся ошибок. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-verbose | Показывать в консоли обрабатываемые модули компиляции или записывать их в файл протокола. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-referenceInfo | Обработать информацию ссылок. Полезно только в связке с компоновщиком. Во всех других случаях информация о ссылках бесполезна. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-progress | Показать ход выполнения (только в режиме -log ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-time | Показать данные о быстродействии | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-noExit | Не вызывать System.exit(n) по завершении компиляции (n=0, если нет ошибок ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-repeat <n> | Повторить процесс компиляции <n> раз (анализ быстродействия). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-inlineJSR | Встроить байт-код JSR (задано неявно для целей >= 1.5) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-enableJavadoc | Учитывать ссылки внутри javadoc | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Опции справки | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-? -help | Показать справку | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-v -version | Показать номер сборки компилятора. Полезно при сообщениях об ошибках. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-showversion | Показать номер сборки компилятора и продолжить. Полезно при сообщениях об ошибках. |
d:\temp -classpath rt.jar -time -g -d d:/tmp
|
Скомпилировать все исходные файлы в d:\temp и ее подпапках. classpath - это rt.jar. Будут созданы все атрибуты отладки, а файлы .class будут записаны в d:\tmp. По окончании пакетной операции будет показана скорость работы компилятора. |
d:\temp\Test.java -classpath d:\temp;rt.jar -g:none
|
Скомпилировать только Test.java и получить все зависимые файлы из d:\temp. classpath - это rt.jar и d:\temp, что означает, что требуемые классы сначала просматриваются в d:\temp и затем в rt.jar. Никакие атрибуты отладки не создаются, а файлы .class будут записаны в d:\tmp. |
<?xml version="1.0" encoding="UTF-8"?> <project name="compile" default="main" basedir="../."> <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> <property name="root" value="${basedir}/src"/> <property name="destdir" value="d:/temp/bin" /> <target name="main"> <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> <classpath> <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> </classpath> </javac> </target> </project>Синтаксис задачи Ant для javac описан в документации по адресу Ant javac. Текущий адаптер поддерживает задачи Javac Ant версий от 1.4.1 до 1.6.5.
Для версий выше 1.5.0 можно задавать вложенные элементы аргументов компилятора для указания особых опций компилятора.
... <javac srcdir="${root}" destdir="${destdir}" debug="on" nowarn="on" extdirs="d:/extdirs" source="1.4"> <classpath> <pathelement location="${basedir}/../org.eclipse.jdt.core/bin"/> </classpath> <compilerarg compiler="org.eclipse.jdt.core.JDTCompilerAdapter" line="-1.5 -warn:+boxing"/> </javac> ...
Во избежание применения сценариев, зависящих от компилятор, задайте аргумент компилятора равным org.eclipse.jdt.core.JDTCompilerAdapter
.
Если он не задан, сценарий можно будет применять только с компилятором Eclipse. Если он задан, то вложенный аргумент компилятора будет проигнорирован, если имя отлично от заданного в свойстве build.compiler
.
JDT Core определяет специальный маркер (тип маркера "org.eclipse.jdt.core.problem") для обозначения ошибок компиляции. Для программного поиска неполадок, обнаруженных компилятором, необходимо использовать стандартный протокол маркеров платформы. Общие сведения об используемых маркерах содержатся в разделе Маркеры ресурсов.
Следующий фрагмент кода находит все маркеры неполадок Java в единице компиляции:
public IMarker[] findJavaProblemMarkers(ICompilationUnit cu) throws CoreException { IResource javaSourceFile = cu.getUnderlyingResource(); IMarker[] markers = javaSourceFile.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE); }
Компоновщик проектов Java сохраняет маркеры неполадок Java. После устранения неполадок и повторной компиляции исходного кода Java маркеры удаляются автоматически.
Значение ИД неполадки устанавливается одной из констант в IProblem . Сообщение о неполадке выводится на языке, соответствующем локали по умолчанию, поэтому может изменяться; идентификатор неполадки не зависит от локали. Константы, определенные в IProblem информативны.
Для сбора сообщений о неполадках, обнаруженных при выполнении операции Java,
необходимо создать реализацию интерфейса
IProblemRequestor . Если
IProblemRequestor был предоставлен для создания рабочих копий, то можно
совместить создание рабочих копий с процедурой обнаружения неполадок. Для этого можно использовать метод
reconcile,
например:
ICompilationUnit unit = ..; // получить некоторую единицу компиляции
// создать инициатор для сбора обнаруженных ошибок
IProblemRequestor problemRequestor = new IProblemRequestor() {
public void acceptProblem(IProblem problem) {
System.out.println(problem.getID() + ": " + problem.getMessage());
}
public void beginReporting() {}
public void endReporting() {}
public boolean isActive() { return true; } // обнаруживает неполадки, если активен
};
// использовать рабочую копию для хранения исходного кода с ошибкой
ICompilationUnit workingCopy = unit.getWorkingCopy(new WorkingCopyOwner() {}, problemRequestor, null);
((IOpenable)workingCopy).getBuffer().setContents("public class X extends Zork {}");
// запустить согласование
workingCopy.reconcile(NO_AST, true, null, null);
В метод acceptProblem(IProblem) можно добавить действие, выполняемое для
обнаруженной неполадки. В данном примере для неполадки выдается сообщение Невозможно
разрешить Zork, или это неправильный базовый класс, а ее идентификатор -
IProblem.SuperclassNotFound.