среда, 18 июля 2012 г.

Logback & Maven-GWT Project

Исходные данные:

  • GWT проект
  • логгирование через slf4j посредством logback
  • сборка проекта через maven
Цели:

  1. надо чтобы logback.xml попадал в WAR-ник
  2. при запуске в Dev Mode надо чтобы использовался другой  logback.xml, чем тот, который попадает в  WAR-ник
  3. при запуске Unit тестов надо чтобы использовалась 3-я конфигурация  logback
Почему logback.xml не попадает в WAR-ник - это отдельная история. Причин я так и не смог выяснить. Причем это вроде касается локальной сборки. При авто-сборке вроде как все в порядке.
Сам logback.xml лежит, где и должен, в папке "src/main/resources".
Для решения проблемы надо при запуске maven указать цель "resources:resources" перед "war:war".
Кроме того, в pom.xml, в секции <build> указываем:
<resources>
  <resource>
     <directory>src/main/resources</directory>
     <includes>
        <include>logback.xml</include>
     </includes>
  </resource>
</resources>

ВАЖНО! Мы специально указываем явно ресурсы, т.к. хотим, чтобы в WAR попали только они (в данном случае он). Если не указать в pom.xml, то будут взяты все ресурсы из "src/main/resources".

ВСЕ. После этих действий logback.xml попадает в WAR-ник, и в папку "war/WEB-INF/classes" проекта.


В решении второй и третьей задач нам поможет сам logback. Дело в том, что при поиске конфигурационного файла сначала ищется logback.groovy, затем logback-test.xml и затем уже собственно logback.xml. C groovy могут быть проблемы (ERROR in ch.qos.logback.classic.LoggerContext[default] - Groovy classes are not available on the class path. ABORTING INITIALIZATION.), поэтому забудет про этот файл.


В "src/test/resources" кладем logback.xml и настраиваем его работы в Unit тестах. А в "src/main/resources" кладем logback-test.xml и настраиваем его для работы в Dev Mode.

Дело в том, что при запуске Unit тестов папка "src/main/resources" не подключается. А вот при запуске приложения в Dev Mode папка "src/test/resources" подключается и с этим ничего нельзя сделать, т.к. это папка с исходным кодом.

В результате в папке "src/main/resources" у нас будет два конфигурационных файла: logback.xml, который попадет в WAR-ник, и  logback-test.xml, который будет использоваться для Dev Mode.

Далее рассмотрим ситуацию, когда у нас одинаковая конфигурация для Dev Mode и для WAR.
Тогда можно там оставить один logback.xml в "src/main/resources". При запуске в Dev Mode будет взят именно файл из "src/main/resources" в соответствии с порядком подключения.
Чтобы не завязываться на порядок подключения, можно завести в "src/main/resources" дубликат logback.xml и назвать его logback-test.xml.


Еще одна проблема - при запуске Unit тестов у нас будет два файла logback.xml в classpath - один из папки "war/WEB-INF/classes" (для WAR) и один из "src/test/resources". Если все хорошо, то первым будет загружен (и следовательно использован) именно файл из "src/test/resources".


Единственный вариант полного избегания зависимости от порядка подключения - это:

  1. файл для WAR назвать logback.xml
  2. файл для Unit тестов назвать logback-test.xml
  3. файл для Dev Mode задать через groovy, и назвать его logback.groovy
Здесь надо разобраться как подключить groovy.
Пока работает порядок подключения - можно не заморачиваться.

Вроде как все.

Если что-то непонятно, то пишите комментарии, будем прояснять.

Спасибо за внимание.

Комментариев нет:

Отправить комментарий