Category Archives: Java
Пара маленьких относящихся к миру Java вещей, о которых можно упомянуть.
1. Недавно обнаружил страшный баг в крайней версии IDEA – отладчик частенько не срабатывал на брейпоинтах. Просто пропускал. Удалось даже написать программу для воспроизведения ошибки. См описание бага. Надеюсь, поправят быстро, т.к. отладчик это последняя надежа.
2. Нашел официальное подтверждение хаку с заменой класса локальной версией. Действительно, JVM даёт приоритет тем класс-файлам, которые лежат в элементах ClassPath, описанных ранее. То есть если у вас есть 2 джарника и в каждом из них один и тот же класс, то будет использован тот, который был записан в -cp первым. Так что можно невозбранно форкать классы из либ и патчить их как вздумается. Главное не забыть прописать при запуске classpath в нужном порядке.
В WAR-архивах это тоже работает, но там в приоритете /WEB-INF/classes, а джарники по идее все равноправны. Но даже приоритет /WEB-INF/classes формально нигде не определён, всё зависит от деталей реализации сервлет-контейнера. Впрочем, в самых популярных это работает.
3. Как поставить бряк на конкретное исключение ?
http://stackoverflow.com/questions/6408596/intellij-idea-how-can-i-create-an-exception-breakpoint-that-stops-on-all-except
Почему-то всегда считал, что если делать трассировку в отладчике (Step In, Step Over), то все остальные потоки в это время приостановлены, поскольку все потоки приостанавливаются при остановке на брейкпоинте. А оказалось, что это не так, и хотя IDEA действительно останавливает все потоки при попадании на точку останова, при дальнейшей трассировке между каждым следующим шагом вся JVM полностью возобновляется. Здесь чел тоже плачется и хочет режим, в котором бы трассировка не возобновляла остальные потоки. На что ребята из JetBrains пока что отвечают, что всё работает, как и должно, by design, и что это и есть правильный подход, т.к. в противном случае могут возникать дедлоки.
Мне кажется, что всё же опция отладки в таком режиме необходима, потому что иначе трассировать многопоточное приложение просто не имеет смысла. Буду надеяться, что фичу одобрят и добавят в будущем. А пока этого не случилось, приглашаю проголосовать за неё в трекере:
Научился сегодня по-простому делать профили а-ля мавно. Рецепт таков:
1) Создаём файл defaults.gradle
. В нём будут лежать значения свойств по умолчанию, например:
allprojects { ext { // Solr connection host = 'localhost' port = '8983' username = '' password = '' } } project(':crawler') { // SQL Server connection project.ext["jdbc.url"]='jdbc:jtds:sqlserver://...' project.ext["jdbc.username"] = 'user' project.ext["jdbc.password"] = 'passasdf' project.ext["jdbc.driverClassName"]='net.sourceforge.jtds.jdbcx.JtdsDataSource' } |
2) Для каждого профиля создаём файл с именем profile-${profile}.gradle
, например, файл profile-stage.gradle
:
allprojects { ext { host = '234.23.42.3' port = '6001' username = '' password = '' } } |
3) В основной скрипт сборки build.gradle
в начало добавляем следующий код:
apply from: "defaults.gradle" if (hasProperty('profile')) { apply from: "profile-${profile}.gradle" } |
Таким образом, defaults.gradle
будет применяться всегда, а скрипт, специфичный для конкретного профиля – только если указывается свойство profile
.
4) Запустить сборку с указанием профиля:
gradlew -Pprofile=stage :crawler:build
Если вы только что собрали что-то с одним профилем, а потом решили пересобрать для другого, убедитесь, что gradle прознал о том, что что-то надо пересобрать. Например, если вы используете Ant Filtering, то градло не поймёт, что ресурсы надо пересобрать – нужно явно выполнить clean
.
0