Привет и спасибо за чтение,
В настоящее время у меня проблема с установкой нескольких ресурсов в мою структуру 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
, чтобы можно было установить ресурс.
Помощь очень ценится. Благодарю вас!