Может стандартный Sun javac делать возрастающую компиляцию?

Недавно я начал использовать компилятор Java Eclipse, потому что это значительно быстрее, чем стандарт javac. Мне сказали, что это быстрее, потому что это выполняет возрастающую компиляцию. Но я все еще немного не уверен в этом, так как я не могу найти авторитетную документацию и о - eclispse's и о солнце - компиляторы "возрастающая функция". Действительно ли это верно, что компилятор Sun всегда компилирует каждый исходный файл, и компилятор Eclipse компилируют только измененные файлы и тех, которые затронуты таким изменением?

Править: Я не использую функцию автосборки Eclipse, но вместо этого я устанавливаю

-Dbuild.compiler=org.eclipse.jdt.core.JDTCompilerAdapter

для моих сборок муравья.

25
задан Paul Sweatte 20 January 2017 в 21:54
поделиться

2 ответа

Верно ли, что компилятор Sun всегда компилирует каждый исходный файл и Eclipse компилятор компилирует только измененные файлы и те, на которые влияет такое изменение?

Я считаю, что вы правы по обоим пунктам.

Конечно, вы можете заставить Eclipse перекомпилировать все.

Но другая часть уравнение заключается в том, что сборка Java для Такие команды, как Ant и Maven, способны компилировать только те классы, которые изменились, и их дерево зависимых классов.

РЕДАКТИРОВАТЬ

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

  • По умолчанию задача сравнивает временные метки .java и соответствующие файлы .class , и только сообщает компилятору Java перекомпилировать исходные файлы (.java), которые новее, чем соответствующие им целевые файлы (.class) или вообще не имеют целевого файла.

  • Задача также учитывает зависимости между классами, которые она определяет путем чтения и анализа информации о зависимостях, встроенной в файлы .class . Определив, какие файлы .class устарели, задача удаляет их, поэтому следующая задача перекомпилирует их. Однако это не совсем надежно. Например, значительные изменения в исходном коде могут привести к тому, что задача может анализировать устаревшие зависимости. Также некоторые виды зависимости (например, от статических констант) не проявляются в формате файла .class .

    Чтобы понять, почему Ant не защищен от ошибок, прочтите раздел «Ограничения» документации .

15
ответ дан 28 November 2019 в 21:52
поделиться

Eclipse, безусловно, делает это. Также он делает это с экономией времени, если у вас включена эта опция (и это по умолчанию). Похоже, что sun тоже этого не делает (это очень легко протестировать, просто создайте небольшой проект, где A - основной класс, который использует класс B, но B не использует класс A. Затем измените A и скомпилируйте проект. еще раз проверьте, изменилась ли временная метка для b.class .

Так работают многие компиляторы (например, gcc). Вы можете использовать такие инструменты, как ant и make, чтобы скомпилировать только ту часть, проект, который был изменен. Также обратите внимание, что эти инструменты не идеальны, иногда eclipse просто теряет отслеживание изменений, и вам нужно будет выполнить полную перестройку.

2
ответ дан 28 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: