Недавно я начал использовать компилятор Java Eclipse, потому что это значительно быстрее, чем стандарт javac. Мне сказали, что это быстрее, потому что это выполняет возрастающую компиляцию. Но я все еще немного не уверен в этом, так как я не могу найти авторитетную документацию и о - eclispse's и о солнце - компиляторы "возрастающая функция". Действительно ли это верно, что компилятор Sun всегда компилирует каждый исходный файл, и компилятор Eclipse компилируют только измененные файлы и тех, которые затронуты таким изменением?
Править: Я не использую функцию автосборки Eclipse, но вместо этого я устанавливаю
-Dbuild.compiler=org.eclipse.jdt.core.JDTCompilerAdapter
для моих сборок муравья.
Верно ли, что компилятор Sun всегда компилирует каждый исходный файл и Eclipse компилятор компилирует только измененные файлы и те, на которые влияет такое изменение?
Я считаю, что вы правы по обоим пунктам.
Конечно, вы можете заставить Eclipse перекомпилировать все.
Но другая часть уравнение заключается в том, что сборка Java для Такие команды, как Ant и Maven, способны компилировать только те классы, которые изменились, и их дерево зависимых классов.
РЕДАКТИРОВАТЬ
В Ant инкрементную компиляцию можно выполнить двумя способами:
По умолчанию задача
сравнивает временные метки .java
и соответствующие файлы .class
, и только сообщает компилятору Java перекомпилировать исходные файлы (.java), которые новее, чем соответствующие им целевые файлы (.class) или вообще не имеют целевого файла.
Задача
также учитывает зависимости между классами, которые она определяет путем чтения и анализа информации о зависимостях, встроенной в файлы .class
. Определив, какие файлы .class
устарели, задача
удаляет их, поэтому следующая задача
перекомпилирует их. Однако это не совсем надежно. Например, значительные изменения в исходном коде могут привести к тому, что задача
может анализировать устаревшие зависимости. Также некоторые виды зависимости (например, от статических констант) не проявляются в формате файла .class
.
Чтобы понять, почему Ant
не защищен от ошибок, прочтите раздел «Ограничения» документации .
Eclipse, безусловно, делает это. Также он делает это с экономией времени, если у вас включена эта опция (и это по умолчанию). Похоже, что sun тоже этого не делает (это очень легко протестировать, просто создайте небольшой проект, где A - основной класс, который использует класс B, но B не использует класс A. Затем измените A и скомпилируйте проект. еще раз проверьте, изменилась ли временная метка для b.class
.
Так работают многие компиляторы (например, gcc). Вы можете использовать такие инструменты, как ant и make, чтобы скомпилировать только ту часть, проект, который был изменен. Также обратите внимание, что эти инструменты не идеальны, иногда eclipse просто теряет отслеживание изменений, и вам нужно будет выполнить полную перестройку.