Мне нужно настроить проект Eclipse с дополнительным компоновщиком, который улучшает байт-код Java, созданный более ранним компоновщиком (в идеале собственным Eclipse). Мне удалось заставить этот построитель запускаться и правильно улучшать вывод построителя Java Eclipse, но через несколько секунд Eclipse повторно запускает свой построитель Java и сбрасывает байт-код обратно. Он не перезапускает мой конструктор улучшений.
Мои настройки
- Импортирован как «проект Gradle» в Eclipse 2019-12 (с Buildship).
- Вручную (и автоматизированный с помощью Gradle) добавлен собственный построитель Ant (который в конечном итоге вызывает Gradle) для улучшения кода, который Eclipse Java Builder создает в bin/main, на месте. Этот построитель настроен для запуска при ручной сборке и автоматической сборке, а не после «очистки» или во время «очистки»< /эм>.
- По умолчанию вышеприведенное заканчивается тремя компоновщиками, сверху вниз: 1. Gradle Project Builder, 2. Java Builder и 3. мой компоновщик расширения байт-кода (да, он указан последним).
Альтернативы, которые я пробовал
- Некоторые комбинации настроек моего компоновщика для запуска после/во время "очистки" также не увенчались успехом. Не знаю, к каким именно событиям они относятся, на самом деле.
- Если бы билдер обновил проект после ... и тоже нет - не помогло.
Попробуйте удалить Java Builder, используя следующий бит в скрипте Gradle (не сработало - он возвращается сам по себе):
eclipse { project { file { whenMerged { projectFile -> projectFile.buildCommands.removeAll { it.name == 'org.eclipse.jdt.core.javabuilder' } } } } }
Попытался отключить построитель Java вручную, и мой построитель расширения байт-кода также создал файлы (используя Gradle). При этом сохраняется следующий файл
org.eclipse.jdt.core.javabuilder.launch
со следующим содержимым... но при перезапуске сборщик снова включается:<?xml version="1.0" encoding="UTF-8" standalone="no"?> <launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType"> <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="org.eclipse.jdt.core.javabuilder"/> <mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/> <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/> </launchConfiguration>
Я пытался (и не смог) найти, изменяется ли (также) какой-либо файл рабочей области (в отличие от файла проекта), чтобы отключить построитель Java.
Вопросы
- Каков «правильный» способ настроить Eclipse для улучшения байт-кода после компиляции?
- Что заставляет Eclipse повторно запускать предыдущие сборщики без повторного запуска моего?
- Есть ли способ исправить (1)?
- Как надежно отключить построитель Java?
Кто-нибудь может помочь? Спасибо!
ОБНОВЛЕНИЕ Дополнительные сведения Я добавил 12 сборщиков и заставил их всех добавлять выходные данные в один и тот же файл журнала для исследования. 12 дополнительных построителей носят информационный характер: 4 перед Java Builder, 4 между Java и построителем расширений и 4 после построителя расширений. Каждый из 12 работает только в одном из четырех условий (отсюда 3x4). Они устроены следующим образом:
- Конструктор проектов Gradle
- 1a-after-clean (запускается только после "очистки")
- 1b-manual (запускается только во время сборки вручную)
- 1c-auto (запускается только во время автосборки)
- 1d-during-clean (запускается только во время "очистки")
- Конструктор Java
- 2a-after-clean (запускается только после "очистки")
- 2b-manual (запускается только во время сборки вручную)
- 2c-auto (запускается только во время автоматической сборки)
- 2d-during-clean (запускается только во время "очистки")
- Создание улучшений байт-кода
- 3a-after-clean (запускается только после "очистки")
- 3b-manual (запускается только во время сборки вручную)
- 3c-auto (запускается только во время автоматической сборки)
- 3d-during-clean (запускается только во время "очистки")
Каждый из 12 информационных конструкторов записывает время, свое имя и размер выбранного тестового класса. В нерасширенном виде он имеет длину 46243 байта. При расширении он становится 53338 байт.
Вот журнал после запуска «Очистить» только для этого проекта (включена «Автоматическая сборка»):
20:19:19
1d-during-clean
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:10 Test.class
20:19:19
2d-during-clean
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:10 Test.class
20:19:20
1c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:10 Test.class
20:19:27
2c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
Buildfile: /.../some-ant.xml
run-gradle:
[echo] Running Gradle: --parallel :...:enhanceEclipseBytecode
...
[java] > Task :...:enhanceBytecode
[java] Enhanced class: ...Test in ...
...
[java] Enhanced 205 classes.
[java] > Task :...:enhanceEclipseBytecode
[java] BUILD SUCCESSFUL in 15s
[java] 2 actionable tasks: 2 executed
BUILD SUCCESSFUL
Total time: 15 seconds
20:19:44
1c-auto
-rw-r--r-- 1 Learner ...\... 53338 3 Mar 20:19 Test.class
20:19:46
1c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:46
2c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:46
3b-manual
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:46
3c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:46
3d-during-clean
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:57
1c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:57
2c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:57
3b-manual
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:57
3c-auto
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
20:19:57
3d-during-clean
-rw-r--r-- 1 Learner ...\... 46243 3 Mar 20:19 Test.class
ОБНОВЛЕНИЕ 2: минимальный пример для воспроизведения
- Создайте папку - назовите ее как хотите.
В этой папке создайте файл build.grade со следующим содержимым:
buildscript { repositories { mavenCentral() } dependencies { classpath 'org.hibernate:hibernate-gradle-plugin:5.4.2.Final' } } plugins { id 'java' id 'eclipse' } apply plugin: 'org.hibernate.orm' repositories { mavenCentral() } dependencies { implementation 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final' } hibernate { sourceSets = [ project.sourceSets.main ] enhance { enableLazyInitialization = true; enableDirtyTracking = true; enableAssociationManagement = false; enableExtendedEnhancement = false; } }
Создайте там src/main/java/learner/TestEntity.java следующим образом:
package learner; import javax.persistence.*; @Entity public class TestEntity { @Id @Column(name = "id", nullable = false, updatable = false) private Long id = null; @Column(name = "name", columnDefinition = "TEXT") private String name = null; public Long getId() { return id; } public void setId(final Long id) { this.id = id; } public String getName() { return name; } public void setName(final String name) { this.name = name; } }
Выполнить
gradle compileJava
. Откройте получившийся двоичный файлbuild/classes/java/main/learner/TestEntity.class
в ASCII- или шестнадцатеричном просмотрщике и просмотрите там такие вещи, как$$_hibernate_write_name
.- Импортируйте этот проект в Eclipse (скажем, 2019-12) как проект Gradle и соберите его. Откройте получившийся
bin/main/learner/TestEntity.class
и не наблюдайте ничего из этого.
eclipse { ... }
. Если да, это может вызвать другую сборку. Что произойдет, если компоновщик проекта Ant просто удалит один файл.class
и не будет трогать другие файлы или запускать Gradle или что-то еще? Взгляните на подключаемый модуль Eclipseorg.eclipse.help.webap
где компоновщик проекта Ant используется для компиляцииjsp
файлов после компоновщика Java. - person howlger   schedule 04.03.2020eclipse {...}
. Прикосновение, создание или удаление непроизводных файлов (производный — это атрибут папки/файла Eclipse) запускает сборку. Пожалуйста, ответьте на мой вопрос Что произойдет, если компоновщик проекта Ant просто удалит один файл.class
и не затронет другие файлы, не запустит Gradle или что-то еще? Предоставьте минимальный воспроизводимый пример. - person howlger   schedule 04.03.2020gradle compileJava
иbuild/classes/java/main/learner/TestEntity.class
поверхbin/main/learner/TestEntity.class
. - person Learner   schedule 04.03.2020.class
должны улучшаться каждый раз при сохранении файла.java
? Почему недостаточно запустить задачу расширения Gradle перед запуском или отладкой приложения Java (например, вручную одно за другим или через группу запуска как одно действие)? - person howlger   schedule 04.03.2020.class
непосредственно перед запуском/отладкой приложения или набора тестов из Eclipse, используйте так называемую Launch Group . Конфигурации запуска можно использовать совместно, поэтому их нужно настроить только один раз. Это действительно так просто. - person howlger   schedule 05.03.2020vi
. Некоторые люди здесь действительно делают. Обратите внимание, что этот проект изолирован и не часто изменяется большинством людей. - person Learner   schedule 05.03.2020