Было несколько вещей, которые мне были неясны / неправильны, и я не мог найти соответствующую документацию, чтобы узнать подробности. Вот краткое изложение того, что нужно знать, чтобы понять это правильно (кое-что из того, что я понял из get go, но не все):
- Интеграция Gradle / Buildship в Eclipse пытается сделать использование внутреннего компилятора Eclipse. Это дизайн Eclipse и имеет свои преимущества во время разработки ... а также недостатки в такие времена - невозможность использовать внешние / производственные строители (в данном случае модель Gradle) для создания здания. По этой причине любое улучшение байт-кода (подключаемые модули или нет), работающее внутри Gradle, не будет иметь никакого эффекта в Eclipse вообще (если они не делают что-то, специфичное для Eclipse c). (я понял это правильно)
- Чтобы выполнить улучшение байт-кода в Eclipse (не apt или то, что мог бы сделать какой-либо плагин Eclipse), нужно добавить собственные компоновщики и расположить их после значения по умолчанию Java строитель (вручную или автоматически). (я тоже это понял)
- В стандартной комплектации Eclipse предлагает два типа компоновщиков - «Муравей» и «Программа». Нет Gradle там. «Программный» вид не кроссплатформенный, только Ant. Ant можно использовать для выполнения каких-либо задач или запуска Gradle кросс-платформенным способом (Java exe c в методе Gradle main ()). (я тоже это понял)
- [Я НЕПРАВИЛЬНО ЗДЕСЬ] Eclipse предлагает четыре "события", к которым можно привязать строителя муравьев: После a «Очистка» , Ручная сборка , Автоматическая сборка и Во время «Очистки» . Я не понял, когда они бегут. Например, я подумал, что «Во время очистки» запускается , в то время как происходит очистка, и что После «Очистки» после этого должен запускаться , чтобы пользовательский конструктор мог выполнить собственная чистка после очистки. Я думал, что за этим последует автоматическая сборка, если включена опция «Автоматическая сборка» или в диалоговом окне «Очистка» установлен флажок «Строить сразу» Это НЕ так . После «Очистить» фактически относится к этапу сборки, а не к очистке, и НЕ будет сопровождаться этапом «Автоматическое построение» (этот этап выполняется только тогда, когда сохраняются изменения и активирован «Сборка автоматически»). В файле * .launch компоновщика это гораздо более очевидно - После "Чистого" фактически называется
full
, а Авто и Ручные сборки называются auto
и incremental
. Это означает, что En Enh Builder должен быть настроен для работы на После «Очистки» в дополнение к Автоматическое построение и Ручное построение и НЕ ДОЛЖЕН быть настроен на запуск * во время «Очистки». Моя ошибка состояла в том, чтобы установить его только для Авто и Ручная сборок. - [Я БЫЛ НЕПРАВИЛЬНО ЗДЕСЬ] Я указал рабочий набор соответствующих ресурсов на вкладке Параметры сборки для построителя расширений. Я установил эти ресурсы как исходный код (для улучшения) и
build.gradle
(содержащий энхансер). На большинстве сборок Eclipse решает не запускать сборщик. Теперь очевидная истина 20-20 заключается в том, что соответствующие ресурсы для этого компоновщика - это выходные файлы компоновщика Java (и build.gradle
), а не исходный код Java. Тем не менее, это не совсем правильный выбор (в отдельности), так как Eclipse, в нашем случае, заканчивается бесконечным l oop - он думает, что энхансер изменил двоичные файлы и, поскольку он настроен на работу при изменении двоичных файлов , запускает сборку снова. Мы НЕ МОЖЕМ устанавливать соответствующие ресурсы вообще, так как это означает «все / что угодно». Энхансер должен быть сделан таким образом, чтобы НЕ трогать уже улучшенные файлы [ОБНОВЛЕНИЕ] , и этого недостаточно. Читайте дальше.
Я до сих пор точно не знаю, почему создатели информации, которые я использовал для исследования этого, добавили свои выходные данные в общий файл журнала, чтобы не было хронологическим, Я могу только предположить, что это связано с буферизацией вывода Eclipse и периодической записью в эти файлы c.
[ОБНОВЛЕНИЕ 1]
[Я ЭТО НЕ ЗНАЛ] Eclipse имеет настройку рабочего пространства (флажок, можно переопределить для проекта) в
Предпочтения ->
Java ->
Компилятор ->
Сборка ->
Выходная папка с именем "
Перестройка файлов классов, измененных другими ", официально обозначаемыми как "
Укажите, Файлы классов, которые были изменены другими, должны быть перестроены, чтобы отменить изменение.". По умолчанию это не отмечено / выключено, что кажется правильным для этого случая.
Это, однако, не работает как рекламируется . Какой бы ни была настройка, Eclipse Java Builder будет реагировать на свои выходные изменения (как если бы они были входными данными, я называю это дефектом) и «отменять модификацию», вызывая бесконечные циклы сборки. Я обнаружил, что об этом симптоме сообщалось много раз - ищите это. С «правильной» настройкой и без взлома Java строитель продолжает отменять изменения, и Eclipse продолжает их повторять, вызывая бесконечное l oop независимо от настройки.
[HACK THAT SEEMS ЧТОБЫ РАБОТАТЬ НАСТОЯЩЕЕ] В дополнение к правильной настройке всего вышеперечисленного, я изменил энхансер, чтобы обеспечить две вещи (может потребоваться только одна или обе, не уверен): (a) что существующие файлы
*.class
НЕ удалено и воссоздано, но
переписано и (b) что их
время последнего изменения изменилось на то, что было до улучшения. Это, кажется, обманывает обнаружение модификации Eclipse достаточно, чтобы вырваться из l oop, даже если размеры файлов различны. Это с Eclipse 2019-12 (4.14.0.v20191210-0610), и он может перестать работать с любым обновлением. Я надеюсь, что к тому времени они исправят бесконечный дефект сборки l oop.