Эффективный рабочий процесс разработки OSGi
Я работаю над продуктом, состоящим из множества пачек, работающих как функции поверх карафа. Обычно наши разработчики работают по одному набору за раз. Наша нормальная разработка выглядит примерно так: code, compile, copy bundle для развертывания папки, тестирования. Мы также обнаружили, что hotdeploy просто отказывается переопределять определенные пакеты, которые установлены как функции без перезапуска сервера или удаления/переустановки функции, поэтому иногда цикл больше.
Мой вопрос: у кого в сообществе есть лучший способ? То, как мы делаем все, работает, но я чувствую, что это довольно медленно и неэффективно, и я уверен, что кто-то придумал что-то лучшее!
EDIT: Я понимаю, что в моем вопросе я был неясен... Мы используем Equinox под Karaf. Мы также используем Eclipse и Maven, хотя я не знаю, что использование Maven имеет значение.
Ответы
Ответ 1
Похоже, вам нужна команда dev: watch. Из документации:
Команда watch может использоваться, чтобы помочь во время разработки. Он позволяет вам настроить набор URL-адресов, которые будут контролироваться. Расположение всех узлов, соответствующих данному URL-адресу, будет автоматически обновляется. Это позволяет избежать необходимости вручную обновлять пакеты или даже копировать пакет в системную папку, если это необходимо. Обратите внимание, что только мотивы, основанные на maven, и моментальные снимки maven будут фактически обновляться автоматически, поэтому, если вы запустите
dev: смотреть *
Он будет контролировать все пакеты, имеющие местоположение, соответствующее mvn: *, которые имеют "-SNAPSHOT" в своем URL-адресе.
Выполнение "dev: watch --help" из оболочки Karaf будет содержать список доступных флагов и аргументов.
Нечто похожее на плагин PAX
Любой из них будет работать очень хорошо, если у вас есть плагин m2 maven для Eclipse.
ОБНОВЛЕНО: В моей компании мы стремимся быть как можно TDD, поэтому многое развивается без явного запуска Karaf. В обычном сочетании модульных тестов мы также используем Pax Exam, который в значительной степени фантастичен даже при запуске из Eclipse =)
Это помогает убедиться, что мы не слишком привязаны к какой-либо специфике Karaf, поскольку она работает с Equinox/Felix/Concierge (поэтому я извожу различные особенности Karaf, от которых мы зависим, например, от проверки подлинности JAAS). Наряду со многими другими классными инструментами/функциональностью, он способен обеспечивать функции Karaf и использовать TinyBundles, вы даже можете создавать пакеты на лету (снова полезно для насмешек /stubbing ).
Pax Exam подключается к инфраструктуре JUnit, предоставляя JUnit @Runner, последняя версия (2) выполняется намного быстрее и основанная на DSL API, поэтому тесты достаточно кратки и понятны.
Использование Pax Exam дает нам хорошее покрытие и короткие сроки разработки. В тех случаях, когда тесты менее практичны или мы охотимся за ошибками, которые не проходят в тестах, команда dev: watch неоценима.
В заключение; IMO, вы должны обязательно управлять своими разработками с помощью тестов (Pax Exam будет хорошо вписываться в вашу существующую сборку, и как только вы привыкнете к ней, вы найдете развитие быстрее). Вы можете сразу начать использовать команду dev: watch, это, безусловно, ускорит вашу текущую ситуацию.
ОБНОВЛЕНИЕ 2: Отвечая на другой вопрос, я добавил пример maven, в котором Pax-Exam тестировал ComponentFactory. Test Driven Development - это, пожалуй, самый эффективный рабочий процесс, доступный для разработчиков сегодня. ссылка на вопрос: osgi: Использование ServiceFactories? и ссылка на исходный код: http://dl.dropbox.com/u/2465717/net.earcam.example.servicecomponent_2011-08-16_15-52.tgz
Ответ 2
если вы используете Eclipse Eclipse Libra, могут быть вам полезны. Весы могут запускать Felix, Equinox и Knopflerfish внутри Eclipse как любой другой сервер с WST. У них есть несколько видеороликов YouTube, как их использовать.
Я также написал несколько инструментов, которые могут помочь:
- Комплект osgi, который подбирает службы OSGI, соответствующие фильтру (osgitest = junit4). При этом вы не будете писать классы Junit, но вы можете предоставить предварительно сконфигурированные объекты (например, OSGI Blueprint). JUnit, чем работает на основе аннотаций, предоставляемых в интерфейсе, который предоставляет ваша служба.
- Плагин maven, который имеет следующие полезные цели
- Запустите контейнеры OSGI и разверните проект bundle maven со всеми его зависимостями (которые, конечно же, являются пакетами OSGI). Начало работы с контейнером OSGI осуществляется с помощью PAX Exam, но тесты JUnit запускаются с помощью пакета OSGI, который я написал (который запускает службы OSGI, которые вы можете предоставить).
- Создайте папку, содержащую ярлык для всех зависимостей проекта (расположенный в репозитории maven или целевом каталоге папки)
Если проекты развертываются на сервере (Eclipse Libra), я должен сказать только обновление X, где X - это идентификатор пакета, и все быстро обновляется. Вам не нужно повторно компилировать проекты, которые публикуются на сервере, если вы запускаете Equinox в Libra, поскольку он указывает на папку целевых классов, которая обновляется, как только вы сохраняете свой класс или pom.xml.
Если вы не публикуете свой проект на сервере, а добавляете его в виде пакета в контейнере, указывающего на папку быстрого доступа, вы также можете запустить команду обновления на консоли OSGi после запуска установки mvn (без перезапуска сервера).
Пошаговое руководство доступно по адресу http://cookbook.everit.org/
С помощью следующего выше метода можно написать тесты как тесты TDD и запустить их как часть компиляции maven на сервере CI.
Надеюсь, вы найдете эти инструменты такими же полезными, как и я!
Ответ 3
У меня были отличные результаты с использованием Equinox в Eclipse - даже замена горячего кода работает правильно. предоставленная, целевая платформа мала, и мы имеем только порядка 50 собственных пакетов, но рабочий процесс выглядит следующим образом:
Во-первых, у нас есть целевая платформа, которая содержит все сторонние и Eclipse-пакеты, Eclipse заботится о загрузке и управлении ими. Затем в рабочей области есть все связки проекта, сгруппированные в 3-4 рабочих набора. Компиляция происходит, как обычно, при сохранении, иногда GWT необходимо перекомпилировать, но даже тогда изменения получаются немедленно, потому что развертывание не должно происходить - работающая система Equinox использует распакованные папки проекта в виде пакетов. Выполнение этого из Eclipse дает нам замену горячих кодов на лету, изменяя файлы шаблонов, только изменения MANIFEST.MF/plugin.xml нуждаются в обновлении пакета - и даже тогда обычно быстрее просто перезапустить фреймворк, чем вводить консоли.
Ответ 4
Это зависит от платформы под Karaf: Felix или Equinox.
Equinox
Eclipse имеет отличную (или почти превосходную) поддержку для запуска Equinox с помощью пакетов по вашему выбору. Две вещи, которые вам нужно подготовить:
- Связки, которые разрабатываются, доступны в рабочей области в виде проектов Plug-in.
- Целевая платформа, содержащая оставшиеся пакеты приложения
Такая настройка позволит вам легко вносить изменения в ваши пакеты, даже время выполнения и легко перезапускать среду выполнения, когда это необходимо. Я вижу, что Karaf является более подходящим, когда вы работаете на удаленной системе, где пакеты развертываются через SSH или FTP или когда вы используете внешние инструменты сборки, такие как Maven, которые имеют возможность автоматически копировать пакет во время выполнения после его создания.
Если вы используете Equinox, это даст некоторое дополнительное преимущество, поскольку среда выполнения будет выполнять код непосредственно из рабочей области.
Felix
У Феликса, похоже, нет такой поддержки для запуска из Eclipse (хотя есть работа над этим, отслеживается в этой проблеме Jira), Вы также можете запустить его как обычное Java-приложение, но это далеко не удобно. В этом случае использование Maven будет намного лучшей альтернативой. Вы все еще можете настроить Eclipse, чтобы в полной мере использовать другие функции PDE, только запуск будет сделан извне.
Резюме
Таким образом, вы всегда можете автоматизировать все, благодаря чему Maven и Karaf помогут вам в этом отношении. Eclipse даст небольшое преимущество, если вы используете Equinox. Вы должны иметь возможность заменить горячий код независимо от метода, который вы используете, потому что замена горячего кода вообще не рассматривает OSGi (за исключением единственного случая, когда вы перезагружаете свой пакет и создается новый загрузчик классов).