Предпочтительно использовать IDEA IntelliJ. Я попытался установить контрольную точку внутри процессора и запустить, но он не сломался.
Как вы отлаживаете java-аннотации процессоров, используя intellij?
Ответ 1
Если вам действительно нужно отлаживать обработчик аннотации, может быть лучше запустить обработчик аннотации из командной строки, а не в вашу среду IDE с включенной отладкой и подключиться к ней с помощью отладчика IDE.
При запуске javac
напрямую вы можете отладить это, указав следующие дополнительные параметры:
javac -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 ... (usual javac parameters go here)
Если вы используете Maven, используйте mvndebug
вместо стандартной команды mvn
- Maven запускает компилятор в процессе.
При запуске Ant перед запуском добавьте следующее в переменную среды ANT_OPTS
:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
При всех этих исполнениях процесс javac, Ant или Maven будет ждать, когда вы присоедините свой отладчик до того, как он начнет выполнение. Инструкции IntelliJ для этого здесь. Для Eclipse здесь.
Ответ 2
Выполните следующие действия. Они работали для меня в студии android для проекта gradle: -
1).In gradle.properties добавить следующие строки
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
2).Edit Build COnfiguration и добавьте удаленную конфигурацию
3). Запустил недавно созданную конфигурацию APT запуска.
4). Добавить точку останова в код обработки аннотации и построить общий проект
Ответ 3
Можно запустить javac
и отладить его, как указано выше. Однако в моем случае было утомительно писать полный класс, поэтому я хотел оставить это в IDEA. Поэтому в модуле, где я хотел применить мой обработчик аннотаций, просто создайте класс с основным методом.
public static void main(String[] args) {
com.sun.tools.javac.Main.main("-proc:only",
"-processor", "my.pkgs.MyAnnotationProcessor",
"my/pkgs/any/ClassIWantProcess.java");
}
Для этого вам нужно добавить $JAVA_HOME/lib/tools.jar
в JAR SDK (по умолчанию его нет). Это по той же причине, почему для создания JSP-приложений для этих приложений JAR необходим этот JAR в своем пути к классам - им нужен компилятор.
Затем просто установите правильный рабочий каталог для вашей конфигурации запуска (поэтому правильный путь к java файлу верен), установите свою точку прерывания в процессор и отлаживайте по своему желанию!
Benefit - classpath уже установлен IDEA и используется "внутренним" javac, потому что здесь это не отдельный процесс. Я считаю, что это можно перевести и на другие IDE.
Ответ 4
Этот учебник написан для проекта Android. Имя основного модуля "приложение" , как обычно. Проект содержит подмодуль, называемый "аннотация" , который является подзависимостью "app". Модуль "приложение" выполняет обработку аннотации с помощью объявления gradle
apt project(':annotation')
.
ПРОСТОЕ ВЕРСИЯ (выполнить компиляцию с терминала и прикрепить от IDE)
- [ТРЕБУЕТСЯ] Добавить новую конфигурацию проекта "+" → "Remote". Проверьте Только один экземпляр. Все остальные настройки генерируются автоматически. Оставьте
<whole project>
как путь к классам. Порт следует оставить по умолчанию 5005.
- [ТРЕБУЕТСЯ] Убедитесь, что вы остановили все экземпляры gradle, вызвав:
./gradlew --stop
- [ТРЕБУЕТСЯ] Запустите команду:
./gradlew --no-daemon -Dorg.gradle.debug=true :app:clean :app:compileDebugJavaWithJavac
- Запустите конфигурацию проекта APT в режиме отладки как можно быстрее:)
- [СОВЕТ] Мы начинаем с файла EMPTY gradle.properties
- [СОВЕТ] НЕ ИСПОЛЬЗУЙТЕ gradle daemon (--no-daemon/org.gradle.daemon = false)
- [HINT] Запустите gradle в режиме отладки (опция org.gradle.debug = true)
- [HINT] Запустите компиляцию модуля приложения, а не компиляцию модуля процессора (компиляция приложения запускает обработку аннотаций!)
- Обычно мы не добавляем никаких параметров компилятора Java в Android Studio (т.е. Файл → другие настройки → Настройки по умолчанию)
РАСШИРЕННАЯ ВЕРСИЯ (используйте gradle.properties)
- Добавьте следующий файл gradle.properties:
org.gradle.daemon=false org.gradle.debug=true
- Запустите компиляцию с терминала:
./gradlew :app:clean :app:compileDebugJavaWithJavac
ДОПОЛНИТЕЛЬНАЯ ВЕРСИЯ (просто нажмите debug в IDE)
- Добавьте bash script в основной каталог проекта (например, compile.sh)
#!/bin/bash ./gradlew :app:clean :app:compileDebugJavaWithJavac &
Помните о '&' знак для фоновой обработки.
- Перейдите к настройкам конфигурации APT, которые мы создали на шаге 1, и добавим конфигурацию Перед запуском. Выберите Запустить внешний инструмент.
- Добавьте путь к compile.sh script, который мы создали ранее.
Внимание
Отказывание gradle компиляции, исключения NullPointer во время компиляции и т.д. иногда приводят к зависанию AndroidStudio (замораживание на стадии обновления gradle). Если вы не можете остановить gradle из IDE, используйте эту команду в терминале:
ps -A | grep gradle | awk '{ print $1; }' | xargs kill -9
Отключение опции отладки во время обновления проекта иногда помогает Android Studio вернуться к правильному пути.
Ответ 5
Я нашел следующий ресурс, который может вам помочь: http://code.google.com/p/acris/wiki/AnnotationProcessing_DebuggingEclipse
Парень объясняет шаг за шагом, как отлаживать обработчики аннотаций, используя Eclipse.
Ответ 6
Обработка аннотации происходит во время компиляции, поэтому обычная отладка не будет работать. Если вы хотите отладить его в контексте вашего проекта, вы можете использовать удаленную отладку IntelliJ, имея Gradle или Maven в режиме отладки. Затем вы можете поместить точки останова в файлы обработчика аннотаций.
См. Отладка обработчика аннотации в любом проекте.
Отказ от ответственности: я написал сообщение.
Ответ 7
Для проекта Maven этот пост, который объясняет следующие шаги немного подробнее, работал у меня:
-
Добавить "Remote" выполнить конфигурацию и установить "порт" на 8000.
-
Выполните команду
mvnDebug clean install
из каталога проекта (в командной строке). -
Запустите конфигурацию запуска. Чтобы начать новый сеанс после завершения процессов, повторите с (2).
Не забудьте запустить mvn install
в зависимостях проекта при их изменении (например, если обработчик аннотации находится в другом артефакте, чем проект, от которого вы отлаживаете его).