Статьи

JXSE и Equinox Tutorial, часть 1

Аннотация

ПРИМЕЧАНИЕ. С января 2015 года вы можете интегрировать JXTA в OSGI через сайт обновлений . WIKI  В chaupal.org   дает подробные инструкции о том , как использовать новые связки 2.8.x JXSE для OSGI.

В этой расширенной серии учебных пособий будут рассмотрены различные способы, с помощью которых инфраструктура JAVA P2P JXSE (ранее известная как JXTA и в настоящее время самая современная реализация JAVA спецификаций JXTA ) может быть приспособлена для работы с Equinox (механизмом на который затмение работает). Было бы заманчиво заменить Equinox на OSGI , и многие из рассматриваемых здесь проблем будут хорошо работать с альтернативными реализациями OSGI, такими как Apache Felix или Knopflerfish., но я сконцентрируюсь на Equinox, потому что это позволит нам сделать несколько вещей с JXSE, которые требуют немного больше ручной работы на других платформах OSGI. Кроме того, я протестировал код только на Equinox, поэтому я не хочу забегать вперед. Этот учебник находится в стадии разработки, поэтому документ будет отредактирован несколько раз.

Этот учебник не предназначен для охвата принципов, лежащих в основе P2P в целом и JXTA / JXSE в частности. Если вы заинтересованы в этом, я бы порекомендовал (бесплатную) книгу Practical Jxta II от Jérôme Verstrynge или ознакомился с онлайн-руководствами для JXTA 2.5, JXSE 2.6 и 2.7 . Этот первый урок призван помочь вам начать работу с JXSE 2.7x в среде Equinox. Предполагается, что читатель хорошо разбирается в разработке плагинов с помощью Eclipse IDE. Если вы новичок в Eclipse, я бы посоветовал вам прочитать отличные статьи по разработке плагинов Ларса Фогеля и освежить в памяти OSGI и Equinox, пока вы в нем.

Немного истории

Если вы искали P2P-платформы для JAVA и наткнулись на официальные веб-сайты, вы, возможно, видели, что там ничего не слышно, и это продолжается уже около трех лет. У вас может даже возникнуть желание поверить, что JXTA — это мертвый проект, и я могу только согласиться. Так что же это за история … и зачем оживлять этого призрака в этом уроке? Я постараюсь ответить на эти вопросы как можно лучше, но, возможно, было бы целесообразно сначала немного рассказать о моем участии в проекте JXTA.

Я участвую в JXTA с 2002 года (!), Хотя вряд ли когда-либо был одним из наиболее заметных участников проекта. На самом деле, я считаю (ed) себя типичным пользователем JXTA; в восторге от замечательных вещей, которые команда SUN и сообщество вокруг них пытались достичь, но, кроме того, в основном интересовались результатами, поскольку я пытался использовать JXTA в проекте, над которым я работал (и работаю). Я решил перенести этот проект на Eclipse / Equinox в 2004 году, и именно тогда у меня начались проблемы с выпуском 2.4x JXTA, с которым мне в итоге удалось работать. Поскольку я был не очень доволен многими сторонними библиотеками, которые были необходимы JXTA к тому времени,и которые развивались более быстрыми темпами, чем команда JXTA могла следовать — прежде всего, Jetty Server — я пытался портировать эти сторонние библиотеки на автономные плагины OSGI и по возможности использовать официальные плагины этих сторонних библиотек. Результаты были предложены сообществу через проект java.netjxta-eclipse, когда версия 2.4x наконец заработала . К сожалению, выпуск 2.5x, который был выпущен около года спустя, заставил меня переделать большую часть этой работы, и я никогда не получал его безупречным.

В то же время команде в SUN было трудно поддерживать постоянный темп, скорее всего, из-за неопределенности будущего их компании, и личные проблемы заставили меня потерять внимание к разработкам JXTA до объявления о выпуске 2.6. x release, который изначально предназначался для обновления jxta-eclipse до этой новой версии. Однако я был поражен новым настроением в сообществе JXTA, возглавляемом несколькими энтузиастами, такими как Жером Верстринж, и поэтому предложил протянуть руку помощи в рассмотрении обновленной документации, тестировании и отладке версии 2.7x. Были некоторые ранние попытки улучшить интеграцию с OSGI, и когда я подходил к декларативным сервисамЯ предложил помочь внести более серьезный вклад в код JXTA, чтобы JXSE 2.8x был полностью готов к OSGI …

.. затем Оракул купил SUN, отменил JXTA и оставалось мертвое молчание.

Опять-таки, некоторые личные проблемы заставили меня отказаться от попыток запустить интеграцию 2.7x с Equinox, но в начале 2013 года у меня наконец-то появилось время выполнить свои обещания и приступить к серьезной модернизации, чтобы предлагать JXSE в качестве декларативных сервисов OSGI. В настоящее время я собираюсь посвятить свою работу EclipseLabs и хочу использовать этот момент для официального возрождения JXSE и, надеюсь, получить больше помощи от других в ближайшие месяцы.

Так что я сделал? В хронологическом порядке:

  1. Изменен net.jxta для создания полной развязки со сторонними библиотеками. JXTA работает с последними версиями Jetty, Netty, javax и другими соответствующими плагинами, поэтому файлы больше не нужны

  2. Изменен net.jxta для работы с плагинами Derby и H2, декларативными сервисами. В ходе выполнения

  3. Разработал RCP, который заменяет приложение мониторинга на основе Swing. В ходе выполнения.

  4. Добавлены инструменты пользовательского интерфейса для отображения свойств диспетчера сети, конфигуратора и модулей JXSE в средствах просмотра свойств и т. Д. В ходе выполнения.

  5. Разработка проектов плагинов JXSE для быстрого развертывания функциональности JXSE в отдельных пакетах, которые затем могут контролироваться RCP.

  6. Разработка кода Practictal Jxta II для работы с JXTA RCP в качестве плагинов JXSE. В ходе выполнения

  7. Разработка функциональности для генерации базового плагина JXTA через файл XML, расположенный в каталоге JXTA-INF. В ходе выполнения.

Поскольку я надеюсь завершить большую часть работы по разработке в ближайшие недели, я надеюсь, что в ближайшие месяцы или около того появится полноценный сайт обновлений с соответствующими банками и исходным кодом, доступным на Eclipselabs . Надеемся, что к концу года мы можем столкнуться с ситуацией, когда разработка JXTA-приложений в OSGI, наконец, стала легкой (!)!

Этот документ отражает эти события. Я надеюсь охватить следующие вопросы:

  1. Настройка базового пакета JXSE 2.7x с минимальными усилиями.

  2. Улучшение комплекта путем удаления необходимых банок и замены их соответствующими комплектами

  3. Дальнейшие улучшения с использованием выделенных пакетов JXSE

  4. Создание проекта плагина JXSE из существующего кода

  5. Создание проекта плагина JXSE с нуля

  6. Создание каркаса проекта плагина JXSE с компонентами JXTA-INF

Оставшаяся часть будет посвящена первой теме. Читатель должен хорошо знать Eclipse и Equinox, но я буду заполнять пробелы настолько хорошо, насколько смогу.

О да, прежде чем я забуду: JXSE 2.7x работает отлично! У вас могут возникнуть обычные проблемы с прохождением NAT и доступом через брандмауэр, но это часть работы с JXTA. Он используется как профессионально, так и многими любителями, поэтому JAVA-реализация спецификаций JXTA заслуживает большего внимания, чем сейчас.

JXSE и Равноденствие

Этот первый урок призван помочь вам начать работу с JXSE 2.7x в среде Equinox. Для целей здесь важно (и многие даже опытные пользователи Eclipse до сих пор часто не осознают этого) знать, что вы разрабатываете плагины (или комплекты) для Eclipse IDE, которые развернуты на цели, который по умолчанию является тем же набором плагинов, который использует ваша IDE. Если вы хотите быть уверены, что разрабатываемые вами плагины настолько легки, насколько это возможно, то ваша цель должна содержать минимум доступных плагинов, который является реализацией OSGI, такой как Felix, Knopflerfish или Equinox, который является OSGI. реализация, на которой работает Eclipse. Недостатком этого выбора является то, что вам нужно добавлять множество плагинов самостоятельно, когда они необходимы. Например, IDE разработчика Eclipse для J2EE по умолчанию имеет Jetty. Если мы хотим использовать эту функциональность на голой цели OSGI, нам придется самим добавлять плагины. Мы выберем этот выбор, как по педагогическим причинам, так и потому, что он позволяет нам разрабатывать легковесные проекты JXSE, которые можно легко перенести на серверы или мобильные приложения.

Поэтому для этого урока мы настроим Eclipse (Kepler) с голой целью Equinox в Windows. Мы будем использовать стандартную Eclipse IDE (скачать здесь ) и загрузить последнюю версию SDK Equinox , которая содержит, среди прочего, исходные файлы для кода.

  1. Разархивируйте IDE в предпочтительное место (например, C: \ Program Files \ Eclipse \ Kepler)

  2. Распакуйте Equinox в другое место (например, C: \ Projects \ Target \ Equinox)

  3. Создайте ярлык на рабочем столе для eclipse.exe в среде IDE для удобного запуска. Целесообразно предоставить администратору права на эту ссылку (щелчок правой кнопкой мыши → свойства → совместимость → проверка «запускать эту программу от имени администратора»), чтобы избежать некоторых странных ошибок во время разработки. Примените это ко всем пользователям, если требуется.

  4. Запустите затмение и выберите подходящее рабочее пространство. Здесь вы будете разрабатывать свои плагины.

Следующим шагом является настройка целевой платформы:

  1. Выберите «Окно» → «Настройки» → «Разработка плагинов» → «Целевая платформа». Вы увидите, что для нее установлена ​​«Рабочая платформа», то есть IDE, которую вы только что установили.

  2. «Добавить» новое определение цели, нажав соответствующую кнопку. Начните с опции по умолчанию («Ничего») и нажмите «Далее».

  3. Дайте вашему определению цели новое имя (например, JXSE Target)

  4. «Добавить» новый каталог, нажав соответствующую кнопку и выбрав опцию каталога. Затем перейдите к месту, где вы распаковали Equinox. Нажатие «Готово» добавит Equinox к определению цели и подскажет, сколько плагинов доступно. Если это ноль, то вы, вероятно, включили родительский каталог. Правильное расположение всегда имеет подкаталог с именем plugins. Вы можете изменить это, выбрав каталог и нажав кнопку «Редактировать».

  5. Завершите работу мастера, нажав кнопку «Готово», и активируйте новую цель, установив соответствующий флажок.

  6. Нажмите OK, чтобы завершить сеанс.

Теперь мы создали затмение с основной целью равноденствия. Теперь нам нужно добавить JXSE 2.7 x в наши проекты. Для этого вы можете загрузить последний файл jar с веб-сайта проекта JXTA и получить соответствующие библиотечные зависимости от sourceforge. Файл 2.7.jar можно скачать здесь . Мы будем использовать код из Practical Jxta II от Jérôme Verstrynge, так как это самая современная книга на эту тему. Кроме того, это бесплатно!

Теперь у нас есть куча jar-файлов, которые содержат все функциональные возможности для создания работающего приложения JXTA. По умолчанию для создания полноценного плагина JXTA можно создать новый проект плагина, добавить каталог lib, в который вы поместите все jar-файлы, включить их в classpath вашего проекта плагина и начать кодирование, верно?

Неправильно! К сожалению, этот подход не работает с Equinox (хотя я верю, что это будет в Felix и Knopflerfish). Проблема в том, что jar-файл с именем Bouncycastle.jar, который предоставляет некоторые функции для шифрования и безопасности , не будет работать должным образом. Отличительной особенностью пакетов Equinox является то, что они работают в своих собственных загрузчиках классов, в то время как bouncycastle должен запускаться в корневом загрузчике классов. Мы можем решить эту проблему, создав фрагментпакет для этого файла JAR, который эффективно ‘OSGI-ifies’ этот файл JAR. Но если мы все равно собираемся раздеть библиотеку, мы можем немедленно заняться другими банками. Большинство из них являются самими пакетами или доступны в виде пакетов. Если они могут использоваться, можно использовать самые последние пакеты (при условии, конечно, что они все еще работают с JXSE 2.7x). На самом деле это относится к следующим файлам в библиотеке, которую мы скачали ранее:

Самые последние версии можно загрузить с соответствующих веб-сайтов или с Orbit . Некоторые другие библиотеки не нужны (например, Феликс, так как мы работаем с Equinox), а некоторые не являются обязательными. Поэтому мы можем значительно улучшить производительность JXTA, если попытаемся уменьшить зависимости от этих устаревших jar-файлов. Очевидно, вам не нужно выполнять всю эту работу самостоятельно, но вы можете использовать альтернативные зависимости, которые я сам собрал . Теперь их можно добавить к определению цели, чтобы включить их функциональность! Плагины довольно недавние (на момент написания) и должны работать без лишних слов. Вы можете разархивировать папку рядом с целью Equinox и включить ее в определение цели:

  1. Выберите «Окно» → «Настройки» → «Разработка плагинов» → «Целевая платформа». Выберите вашу цель и нажмите «Изменить»

  2. «Добавить» новый каталог, нажав соответствующую кнопку и выбрав опцию каталога. Затем перейдите в папку, в которую вы распаковали пакеты зависимостей. Нажатие «Готово» добавит Equinox к определению цели и подскажет, сколько плагинов доступно. Если это ноль, то вы, вероятно, включили родительский каталог. Правильное расположение всегда имеет подкаталог с именем plugins. Вы можете изменить это, выбрав каталог и нажав кнопку «Редактировать».

  3. Завершите работу мастера, нажав кнопку «Готово» и «перезагрузите» цель, нажав соответствующую кнопку.

  4. Нажмите OK, чтобы завершить сеанс.

С этим мы готовы начать программирование!

Ваш первый проект JXSE 2.7X Bundle

Для первого проекта пакета JXSE мы будем использовать пример проекта из
Practical Jxta II . Создайте новый проект плагина:

  1. Выберите «Файл» → «Создать» → «Проект плагина» (через «Другое», если он не виден сразу).
  2. Заполните необходимые данные. Включите активатор, который запускается при запуске.
  3. Когда проект будет создан, включите в него новый файл с именем ‘lib’ и скопируйте jxse-2.7.jar, который вы скачали ранее, и файл org.mortbay.jetty.jar из библиотечных зависимостей в это место. Не забудьте обновить проект после того, как это будет сделано.
  4. Добавьте банки в путь к классам плагина, выбрав вкладку «Runtime» в редакторе манифеста. Нажмите кнопку «Добавить», перейдите в папку lib и выберите банки.
  5. Создайте зависимости от комплектов дополнительной цели, которую мы включили ранее. Результирующий файл MANIFEST-MF должен выглядеть примерно так:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Jxta test
Bundle-SymbolicName: org.myorganisation.jxta.example1
Bundle-Version: 1.0.0.v20130816
Bundle-Activator: org.myorganisaton.jxta.example1.Activator
Bundle-Vendor: MyOrganisation
Require-Bundle: org.eclipse.core.runtime,
org.jboss.netty.httptunnel;bundle-version="0.92.0",
derby;bundle-version="10.8.2000002",
org.h2;bundle-version="1.3.170",
javax.servlet;bundle-version="3.0.0",
org.jboss.netty;bundle-version="3.2.5"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: lib/jxse-2.7.jar,
.,
lib/org.mortbay.jetty.jar

Далее мы добавляем два файла из примеров , которые описаны в Practical JXTA II.

  1. Скопируйте файл 100_Starting_And_Stopping_JXTA.java из папки A_JXTA_Connection_And_Local_Configuration в исходное местоположение вашего проекта (с активатором java)

  2. Сделайте то же самое для Tools.java в Z_Tools_And_Others

  3. Обновите ваш проект и исправьте ошибки. Имена пакетов неверны, а некоторые импортируют.

  4. Включите пример в Активатор следующим образом:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

.... public void start(BundleContext bundleContext) throws Exception { Activator.context = bundleContext; _100_Starting_And_Stopping_JXTA_Example.main(null); }

Мы почти на месте! Нам нужно только создать конфигурацию запуска , чтобы все заработало :

  1. Выберите новую конфигурацию отладки (или запуска): Выполнить → Конфигурация отладки.

  2. Добавьте новую конфигурацию запуска на основе OSGI Framework. Дайте ему отличительное имя и выберите плагин, который вы только что сделали из узла «Рабочая область».

  3. Нажмите «Добавить необходимые комплекты», чтобы создать рабочую конфигурацию запуска.

  4. Добавьте org.eclipse.equinox.console и три пакета org.apache.felix.gogo.

  5. Проверьте конфигурацию запуска. Если все прошло хорошо, вы должны получить сообщение «Проблемы не обнаружены»

  6. Запустите конфигурацию, нажав соответствующую кнопку.

Если все прошло хорошо, вы увидите, что в консоли появилось много сообщений, и должны появиться три всплывающих сообщения о том, что Jxta Network запущена, подключена и остановлена. Поздравляем, вы только что успешно развернули свой первый проект JSE Bundle! С этого момента должно быть довольно легко интегрировать примеры из Practical JXTA II в ваши проекты Equinox!

ПРИМЕЧАНИЕ. В описанной выше ситуации NetworkManager запускается в методе запуска Активатора. Это может привести к исключениям тайм-аута при запуске пакета. Если вы испытываете это, то может быть лучше представить службу executor, которая выполняет код примера:

public class Activator implements BundleActivator, Runnable{

    private ExecutorService executor;

    public Activator( ) {
        super();
        executor = Executors.newSingleThreadExecutor();
    }

    public void start( ... ){
        executor.execute(this);
        ...
    }

    public void stop( ... ){
        executor.shutdown();
        ...
      }

    @Override
    public void run() {     
        _100_Starting_And_Stopping_JXTA_Example.main(null);
        System.err.println( "Container started successfully");
    }
}

Дополнительный бонус

Большинство разработчиков, которые работали с JXTA в прошлом, могут быть приятно удивлены тем, что Equinox решает одну проблему, которая долго мешала разработке JXTA, а именно то, что вы не можете развернуть несколько проектов JXTA в одной среде разработки, поскольку JXTA будет жаловаться, что «только одна мировая экспертная группа разрешено быть активным ». Тот факт, что все пакеты Equinox используют свои собственные загрузчики классов, часто является серьезной проблемой для новичков в Eclipse, но здесь это на самом деле является преимуществом: вы можете запускать несколько проектов JXSE в одной IDE!

Чтобы продемонстрировать это, вы можете скопировать проект, который вы только что сделали в рабочей области, дать ему другое имя в редакторе манифеста и, для демонстрационных целей, удалить

MyNetworkManager.stopNetwork ();

в коде примера.

ПРИМЕЧАНИЕ. Конечно, лучше изменить код таким образом, чтобы метод stopNetwork () вызывался в методе stop () Активатора.

Запустите проекты, включив новый проект в конфигурацию запуска (обычно это делается автоматически) и запустив его. Вы увидите, что оба проекта запускаются без каких-либо исключений.

Вывод

Это руководство дало нам начало разработки приложений JXSE 2.7x с Equinox (и Eclipse). Опытные разработчики Eclipse уже могут увидеть некоторые возможности для улучшений, и, действительно, я буду решать эти проблемы на более позднем этапе. На данный момент новые разработчики в JXTA могут начать работу с книгой Practical JXTA II, а опытные разработчики будут иметь идею перенести свой код на Equinox (и другие платформы OSGI, так как он должен там работать … кроме одновременной разработки JXSE). проекты, то есть!

В следующем посте я расскажу о дальнейших улучшениях, устраняя зависимость от устаревшей банки Jetty и инструментов на основе свинга, которые используются в Practical JXTA II.