Category Archives: Java

Java. Всё за жизнь

Written by elwood

Пара маленьких относящихся к миру Java вещей, о которых можно упомянуть.

1. Недавно обнаружил страшный баг в крайней версии IDEA – отладчик частенько не срабатывал на брейпоинтах. Просто пропускал. Удалось даже написать программу для воспроизведения ошибки. См описание бага. Надеюсь, поправят быстро, т.к. отладчик это последняя надежа.

2. Нашел официальное подтверждение хаку с заменой класса локальной версией. Действительно, JVM даёт приоритет тем класс-файлам, которые лежат в элементах ClassPath, описанных ранее. То есть если у вас есть 2 джарника и в каждом из них один и тот же класс, то будет использован тот, который был записан в -cp первым. Так что можно невозбранно форкать классы из либ и патчить их как вздумается. Главное не забыть прописать при запуске classpath в нужном порядке.

Пруф
Тред на stackoverflow

В 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

Трассировка в IDEA возобновляет другие потоки!

Written by elwood

Почему-то всегда считал, что если делать трассировку в отладчике (Step In, Step Over), то все остальные потоки в это время приостановлены, поскольку все потоки приостанавливаются при остановке на брейкпоинте. А оказалось, что это не так, и хотя IDEA действительно останавливает все потоки при попадании на точку останова, при дальнейшей трассировке между каждым следующим шагом вся JVM полностью возобновляется. Здесь чел тоже плачется и хочет режим, в котором бы трассировка не возобновляла остальные потоки. На что ребята из JetBrains пока что отвечают, что всё работает, как и должно, by design, и что это и есть правильный подход, т.к. в противном случае могут возникать дедлоки.

Мне кажется, что всё же опция отладки в таком режиме необходима, потому что иначе трассировать многопоточное приложение просто не имеет смысла. Буду надеяться, что фичу одобрят и добавят в будущем. А пока этого не случилось, приглашаю проголосовать за неё в трекере:

https://youtrack.jetbrains.com/issue/IDEA-43728

И снова gradle: делаем профили

Written by elwood

gradle_logo

Научился сегодня по-простому делать профили а-ля мавно. Рецепт таков:

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.