WedX - журнал о программировании и компьютерных науках

OSGi: нельзя установить более 1 ресурса напрямую из репозитория?

Привет и спасибо за чтение,

В настоящее время у меня проблема с установкой нескольких ресурсов в мою структуру OSGi. Я использую Eclipse IDE с плагином Bndtools.

У меня есть онлайн-репозиторий OSGi, соответствующий RFC 112. Я успешно написал метод, который может разобрать все эти ресурсы в файл List<Resource>. Ресурсы теперь доступны для меня, поскольку я могу получить их с помощью метода .get(int) списка.

Я написал метод, который может установить ресурс непосредственно в фреймворк, код которого можно найти ниже:

public void installResource(Resource res) {

    RepositoryContent myRepoContext = (RepositoryContent) res;

    InputStream myInputStream = myRepoContext.getContent();

    try {
        installBundle(myInputStream);
        System.out.println("Installation of " + res.toString() + " SUCCESSFUL.");
    } catch (Exception e) {
        System.out.println("Installation of " + res.toString() + " FAILED.");
        e.printStackTrace();
    }

И это с использованием метода installBundle(InputStream inputstream, который я написал, который заключается в следующем:

public void installBundle(InputStream inputStream) {
    Bundle bundle = null;
    try {
        bundle = context.installBundle(null, inputStream);
        System.out.println("Context installed bundle correctly");

    } catch (BundleException e) {
        System.out.println("Context could not install bundle correctly.");
        e.printStackTrace();
    }

}

Теперь я пытаюсь установить несколько ресурсов в свою структуру. Я НЕ хочу, чтобы они находились в состоянии RESOLVED, достаточно состояния INSTALLED.

Когда я пытаюсь установить 1 ресурс, все работает нормально:

installResource(resource1);

Это работает правильно, потому что если я затем запрошу текущие установленные пакеты/ресурсы в фреймворке с помощью команды lb в оболочке, я увижу, что пакет находится там в состоянии INSTALLED:

13|Installed  |    1|org.dyamand.test.serialization (0.13.15)|0.13.15

Пока все хорошо, способ установки Ресурса работает. Хотя я думал. Когда я пытаюсь установить другой ресурс, что-то идет не так. Я не получаю никаких сообщений об ошибках или исключениях. Наоборот, я вижу, как распечатываю сообщения типа Installation of " + res.toString() + " SUCCESSFUL.". Это должно означать, что ресурс был установлен правильно, так как никаких ошибок или ничего не было возвращено.

Но когда я снова проверяю пакеты, используя lb, второго ресурса/пакета там нет. Первый есть. Это было опробовано со многими различными ресурсами (некоторые из них были только в состоянии INSTALLED, некоторые в состоянии RESOLVED). Это никогда не работало, только для установки первого ресурса.

Например, если я остановлю фреймворк и снова запущу его со следующим кодом:

installResource(resource1);
installResource(resource2);

Единственное, что происходит, это установка ресурса resource1.

Может быть, нельзя установить второй ресурс, если предыдущий не находится в состоянии RESOLVED или ACTIVE?

Так я думал сначала, но оказалось, что это неправильно. Вместо установки напрямую из ресурса, полученного из репозитория OSGi, я пошел в Maven Central и получил 3 случайных пакета и их прямой URL. URL-адреса можно найти в приведенном ниже коде, а также то, как был вызван метод для установки. Снова использовался метод installBundle:

     installBundle("https://search.maven.org/remotecontent?filepath=org/osgi/org.osgi/3.0.0/org.osgi-3.0.0.jar");
     installBundle("https://search.maven.org/remotecontent?filepath=org/osgi/enroute/examples/microservice/rest-app-jpa/0.0.1/rest-app-jpa-0.0.1.jar");
     installBundle("https://search.maven.org/remotecontent?filepath=org/coindirect/api/1.0.1/api-1.0.1.jar");

При таком запуске фреймворка и последующем запросе пакетов с использованием lb все 3 из них отображаются в состоянии INSTALLED. См. вывод lb ниже:

 13|Installed  |    1|osgi (3.0.0)|3.0.0
 14|Installed  |    1|rest-app-jpa (0.0.1)|0.0.1
 15|Installed  |    1|https://search.maven.org/remotecontent?filepath=org/coindirect/api/1.0.1/api-1.0.1.jar (0.0.0)|0.0.0

Я искал в Интернете объяснение, почему это происходит, поэтому мой вопрос ко всем вам: Кто-нибудь знает, почему я не могу напрямую установить несколько ресурсов во фреймворк?

Я не понимаю, чем установка напрямую с URL-адреса отличается от установки напрямую с ресурса, поскольку они оба работают (по крайней мере, в первый раз). Кто-то уже заметил, что я могу установить все свои пакеты по их прямой URL-ссылке, и да, это сработает, но: у меня нет прямых URL-ссылок для ресурсов, которые я беру из своего репозитория. Я могу получить доступ только к Capability с пространством имен osgi.content, как и мой метод, чтобы получить InputStream, чтобы можно было установить ресурс.

Помощь очень ценится. Благодарю вас!


Ответы:


1

Я предполагаю, что context.installBundle(null, inputStream) относится к этот метод. Если это так, вы передаете null как пакет location. В спецификациях четко не указано, что должно произойти, если location равно null, но они говорят

Каждый пакет однозначно идентифицируется строкой местоположения. Если установленный пакет использует указанное расположение, методы installBundle должны возвращать объект Bundle для этого установленного пакета, а не устанавливать новый пакет.

Итак, я предполагаю, что null является (или каким-то образом становится) действительным location, а затем каждая попытка после первой пытается использовать один и тот же location, который, согласно спецификации, не устанавливает пакет.

16.08.2019
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]