пятница, 25 сентября 2015 г.

Как продебажить Maven проект на фазе тестов

Подход 1.

Запускаем в проекте:

$ mvn -Dmaven.surefire.debug test
Процесс Mojo запуститься, для тестов он запустит отдельных процесс, который будет выполняться паралельно, паралельный процесс запустится на порту 5005, и остановится ожидая подключения дебагера на этот порт.
Теперь мы можем из IDE подключиться удаленным подключением к этому порту по протоколу  jdwp.


Подход 2.

Все то же самое, но отключаем создание второго потока под тесты. Зачем это может быть нужно? Может потому что если настроить на несколько потоков, то на свободных потоках будут запускаться несколько тестов одновременно, после того как мы подключимся приложение остановится только там где стоят точки останова, все остальные тесты могут в фоне повыполняться, пока мы дебажим один тест, и мы уже вспомнив о другом должны будем все перезапускать сначала?

$ mvn -Dmaven.surefire.debug -DforkCount=0 test
Так мы знаем что ничего другого в фоне не выполняется.

Подход 3.
Иногда нужно изменить порт, или что-то другое в настройках дебага, для этого указываем параметры передаваемые jvm при запуске(java [параметры]) явно:
$ mvn -Dmaven.surefire.debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -Xnoagent -Djava.compiler=NONE" test

Либо чтобы не писать много буков каждый раз при перезапуске, так:

$ export MAVEN_OPTS=-Dmaven.surefire.debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -Xnoagent -Djava.compiler=NONE"
$ mvn test
Так в текущей сессии терминала мы можем не указывать maven.surefire.debug параметр.

Подход 4.
Отдебажить только один тестовый класс:
$ mvn -Dtest=MySuperClassTest -Dmaven.surefire.debug test

Подход 5.
Можно с версии 2.0.8 сократить количетсво букв, чтобы не указывать maven.surefire.debug,  так:
$ mvnDebug -DforkCount=0 test

В результате этих манипуляций jvm запустит наш jar проекта и будет ожидать удаленного подключения.

JPDA

Java Platform Debugger Architecture (JPDA)

Java Virtual Machine Profiler Interface (JVMPI) и Java Virtual Machine Debug Interface (JVMDI) были замещены в JDK 5.0 новым инетерфейсом  Java Virtual Machine Tool Interface (JVM TI)

JVM TI нативный программный интерфейс для использования сторонними инструментами, чтобы получать состояния JVM. Решаются такие задачи как профилирование, отладка, мониторинг, анализ потоков, coverage analysis tools.

JDWP (Java Debug Wire Protocol) - протокол для общения между дебагером и JVM, которую он дебажит.

JDWP Interface - C-шный интерфейс для протокола.

JDI (Java Debug Interface) - высокоуровневый Java интерфейс, наверно для дебагеров написанных на Java.

Получить доступ к классам WAR модуля

Для модуля интеграционных и приемочных тестов нужен доступ к классам из модуля для веб-архива. Для этого нужно в модуле веб-архива добавить нстройку war-плагина:
<plugin>
  <artifactid>maven-war-plugin</artifactid>
  <version>[2.6,)</version>
  <configuration>
    <attachclasses>true</attachclasses>
  </configuration>
</plugin>

Ну а в зависимом модуле, поставить зависимость и определить для нее classifier в classes 
<dependency>
            <groupId>de.scsynergy</groupId>
            <artifactId>Dms</artifactId>
            <version>0.1</version>
            <classifier>classes</classifier>
            <scope>test</scope>
        </dependency>

среда, 16 сентября 2015 г.

here document & here string

Получило распорстранение  в языках программирования из Unix shell-ов - для переопределения инпут потока команды не из файла, а прямо в консоли, - в языках программирования это мультистрочность строки.

среда, 9 сентября 2015 г.

Работа с бинарными дампами MongoDB

Сделать дамп одной базы:
mongodump --db elementary --out db.elementary-09092015.mongodump
tar -zcvf db.elementary-09092015.mongodump.tar.gz db.elementary-09092015.mongodumpp

Восстановить дамп:
tar -xzf db.elementary-09092015.mongodump.tar.gz 
mongorestore db.elementary-09092015.mongodump