Почему иногда пропадают feature в Servicemix

Написано 9 Ноябрь, 2015 в категории Java,Разработка ПО


Однажды, в самый неподходящий момент, когда срочно надо было проверить работоспособность бандла, я запустил Servicemix и с удивлением обнаружил что ни одной моей фичи(feature) в списке нет. (Список фич можно посмотреть на вкладке Features в Webconsole или командой features:listurl в консоли karaf'a) А что мы делаем в таких случаях? Правильно! Смотрим логи!

А в логах было примерно так:

17:13:50,867 | WARN | rint Extender: 1 | FeaturesServiceImpl | 27 - org.apache.karaf.features.core - 2.2.11 | Unable to add features repository mvn:com.example/artefact.deploy/1.0.0-SNAPSHOT/xml/features at startup
java.lang.RuntimeException: URL [mvn:com.example/artefact.deploy/1.0.0-SNAPSHOT/xml/features] could not be resolved.
...

Это было очень подозрительно! Надо было проверить есть ли бандл в локальном репозитарии .m2/repository

Бандл был на месте, в полной сохранности, а значит, это Servicemix почему-то перестал видеть локальный репозитарий maven. Настройки доступа к maven хранятся в директории Servicemix в файле конфигурации etc/org.ops4j.pax.url.mvn.cfg
Беглый осмотр не выявил каких-то явных косяков (правда я не особо-то и разбираюсь в этом файле конфигурации), поэтому решено было включить DEBUG уровень логов и смотреть, где же Servicemix пытается найти мою фичу. К слову сказать, настройки логирования находятся рядышком в etc/org.ops4j.pax.logging.cfg

После перезапуска микса, в логах (data/log/servicemix.log) перед RuntimeException было видно что система пытается найти эту фичу, но по очень странному пути

17:37:10,814 | DEBUG | rint Extender: 2 | Connection | 2 - org.ops4j.pax.url.mvn - 1.2.8 | Could not download [Version [1.0.0-SNAPSHOT] from URL [file:/D:/apache-servicemix-4.5.3/$%7Buser.home%7D/.m2/repository/com/example/artefact/1.0.0-SNAPSHOT/artefact-1.0.0-SNAPSHOT-features.xml]]

Какой-то непонятный локальный url...

Тут сделаем отступление!
В etc/org.ops4j.pax.url.mvn.cfg два параметра отвечают за работу с локальным репозитарием maven'a - это org.ops4j.pax.url.mvn.settings и org.ops4j.pax.url.mvn.localRepository

org.ops4j.pax.url.mvn.settings - это путь к settings.xml maven'a из которого Servicemix берет путь к локальному репозитарию и список maven репозитариев, если этот список явно не определен с помощью параметра org.ops4j.pax.url.mvn.repositories. По умолчанию setting.xml Servicemix ищет в ${user.home}/.m2/settings.xml, затем в ${maven.home}/conf/settings.xml, затем в ${M2_HOME}/conf/settings.xml

org.ops4j.pax.url.mvn.localRepository позволяет указать путь к локальному репозитарию. Значение по-умолчанию System.getProperty( "user.home" ) + "/.m2/repository". Значение по-умолчанию применяется только, если путь к локальному репозитарию не был найден в .m2/settings.xml...

Оба этих параметра у меня закомментированы, т.е. применяются значения по умолчанию.

Тут-то меня и осенило, как я мог поломать видимость локального репозитария maven'a из Servicemix! Я действительно недавно экспериментировал с настройками в .m2/settings.xml и действительно добавил туда:

<localRepository>${user.home}/.m2/repository</localRepository>

Что же сделал Servicemix после того как я добавил эту строчку в .m2/settings.xml ? Он нашел эту строчку и не стал использовать значение по-умолчанию параметра org.ops4j.pax.url.mvn.localRepository. При этом найти-то он нашел, а вот правильно распарсить не смог. Тут для меня большая загадка, почему у Servicemix не получилось вытащить путь, но проблемы как минимум 2:
1) Servicemix попытался распарсить конструкцию ${user.home} и почему-то не сумел, т.е. у него получилось $%7Buser.home%7D, вместо значения переменной окружения user.home
2) Почему-то в начало пути было добавлено значение переменной окружения SM_HOME (хотя тут я не уверен).

Проблема решилась как только я закомментировал элемент localRepository в .m2/settings.xml !