Я пытаюсь установить пакеты OSGi. Я могу сделать это успешно. Прямо сейчас, что я делаю, в нашей компании у нас есть своего рода хранилище, где мы храним все банки OSGi. Поэтому я отправляюсь и загружаю эти баннеры OSGi в какой-то локальный каталог, а затем я пытаюсь установить эти пакеты из локального местоположения, откуда он был загружен из моего хранилища.Установите пакет osgi, используя байтовый массив вместо местоположения файла?
И ниже метод принимает только местоположение файла. Поэтому я предоставляю свой полный путь к файлу на этом пути.
context.installBundle(localFilename)
Есть ли способ, я могу установить его с помощью byte[]
. В основном я стараюсь не загружать файл jar из своего хранилища в локальную папку, а затем использовать это локальное местоположение для установки пакетов.
private static void callMethod() throws BundleException {
final IStorageServiceClient client = StorageServiceConsumerProvider.getStorageServiceClient(envType);
final StorageObjectIdentifier objIdentifierDir = new StorageObjectIdentifier(name, version, null);
final List<Map<String, String>> dirs = new ArrayList<Map<String, String>>();
client.listDirectory(objIdentifierDir, dirs);
final String filename = name + Constants.DASH + version + Constants.DOTJAR;
final String localFilename = basePath + File.separatorChar + filename;
// first of all, I am trying to delete the jar file from the local folder, if it is already there
new File(localFilename).delete();
final StorageObjectIdentifier objIdentifier = new StorageObjectIdentifier(name, version, filename);
// now I get the byte array of the jar file here.
final byte[] b = client.retrieveObject(objIdentifier);
// now I am writing that jar file to that local folder again using the byte array.
final FileOutputStream fos = new FileOutputStream(localFilename);
fos.write(b);
fos.close();
// now the jar file is there in that location, and now I am using the full path of the jar file to intall it.
BundleContext context = framework.getBundleContext();
List<Bundle> installedBundles = new LinkedList<Bundle>();
installedBundles.add(context.installBundle(localFilename));
for (Bundle bundle : installedBundles) {
bundle.start();
}
}
Есть ли способ, чтобы сделать эту вещь без копирования файла банки с моего места хранения в мою локальную папку, а затем использовать полный путь к моему локальному файлу банки, а затем установить его?
Может ли кто-нибудь помочь мне с этим простым примером на вышеприведенном коде? Спасибо за помощь.
вы пытались с помощью 'BundleContext # installBundle (String, InputStream)', что-то вроде этого: 'context.installBundle (Filename , новый ByteArrayInputStream (b)); ' – Katona
еще нет. Можете ли вы привести мне пример, как это сделать? Спасибо – AKIWEB
Я думаю, вам нужно заменить 'context.installBundle (localFilename)' на 'context.installBundle (имя_файла, новый ByteArrayInputStream (b))', он должен компилироваться, а если и работает, то вы можете избавиться от копирования local folder – Katona