2016-02-10 2 views
1

Привет, я загружаю некоторые функции и пакеты во время выполнения с помощью функций FeaturesService и BundleContext. Все эти вещи загружены успешно. После этого, если я выполняю операцию над объектом bundlecontext, я получаю java.lang.IllegalStateException: Недопустимый BundleContext.Karaf PaxExam получение java.lang.IllegalStateException: Invalid BundleContext

@Inject 
FeaturesService service; 
@Before 
public void init() throws Exception{ 
    service.installFeature("hibernate"); 
    service.installFeature("hibernate-validator"); 
    service.installFeature("transaction"); 
    service.installFeature("jpa"); 
    service.installFeature("hibernate-envers"); 
    service.installFeature("hibernate-envers"); 
    bc.installBundle("wrap:mvn:com.oracle/ojdbc6/11.2.0").start(); 
    service.installFeature("DBHandler"); 
    bc.getBundle(); // Fails 
} 

После многократного просмотра я понял, что вам нужно обновить комплекты. Как это сделать программно и получить обновленный объект bundleContext

ответ

0

Этот код неподвижную мою проблему

public void refreshBundles() { 

     Bundle currentBundle = FrameworkUtil.getBundle(MyTest.class); 
     if (currentBundle == null) { 
      return; 
     } 

     BundleContext bundleContext = currentBundle.getBundleContext(); 
     if (bundleContext == null) { 
      return; 
     } 

     Bundle systemBundle = bundleContext.getBundle(0); 
     if (systemBundle == null) { 
      return; 
     } 

     FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class); 
     frameworkWiring.refreshBundles(null); 
     bc = frameworkWiring.getBundle().getBundleContext(); 
    } 
3

У вас есть это исключение, если вы используете недействительный пакет: он был остановлен или обновлен (обновление останавливает комплект и запускает новый экземпляр)

Когда вы устанавливаете функцию, по умолчанию Karaf пытается определить список пакетов для обновления из-за новых возможностей. Например, если пакет имеет необязательную зависимость от пакета, а новая функция добавляет этот пакет, то этот комплект будет обновлен, чтобы обновить его проводы. Это транзитивно: все зависимые расслоения также обновляются.

Кроме того, при использовании «завернуть» протокол, это создать пакет из баночки, импортируя все используемые в комплекте с разрешением «необязательного»

В вашем случае, я полагаю функцию «DBHandler» добавить пакет, который используется вашим пакетом.

Вы можете:

  • После установки функции, искать свой узелок на Символическое, с BundleContext.getBundles(): Вы будете иметь экземпляр действительного пучка
  • Используйте параметр NoAutoRefreshBundles для отключите обновление при установке функции (featureService.installFeature("..", EnumSet.of(FeatureService.NoAutoRefreshBundles))). Но это не очень хорошая идея, так как некоторые расслоение не будет видеть новый пакет
+0

Jermie я нашел способ освежить и обновить bundleContext которая заботилась о моей проблеме – Charity

+0

Если кто-то ожидает использования решения Jérémie, найдите перечисление в 'FeaturesService.Option' вместо просто' FeaturesService' – buer

Смежные вопросы