Как понять, почему в Apache Felix Log не выполняются требования к пакетам?
Я использую Felix во встроенном режиме, с пакетом File Install, и у меня есть пакет, который установлен, но не разрешен (то есть не запускается / активен), и я изо всех сил пытаюсь найти основную причину. в журнале...
Как и где вы можете получить полезные сообщения типа "Невозможно разрешить... потому что..." или "BundleException: неразрешенное ограничение в пакете... Невозможно разрешить... отсутствует требование... osgi.wiring.package" сообщений в журнале, автоматически из среды Felix и / или пакета File Install? Я не вижу ничего подобного - я должен быть? Куда?
Я также добавил ведение журнала (через Apache Felix Log и https://github.com/everit-org/osgi-loglistener-slf4j), но все же нада - вам нужно сделать больше, чем я, чтобы включить ведение журнала для такого рода проблем во (Embedded) Felix?
Затем я добавил интерфейс командной строки Felix Gogo Shell и обнаружил, что его inspect
команда, тоже не очень полезна (не работает для пакетов, которые не разрешены), и только start
покажет основную причину - но как я могу получить это, чтобы войти, без необходимости иметь консоль и сделать старт:
g! lb
START LEVEL 1
ID|State |Level|Name
0|Active | 0|System Bundle (5.6.1)|5.6.1
1|Active | 1|Apache Felix File Install (3.5.4)|3.5.4
2|Active | 1|Apache Felix Remote Shell (1.1.2)|1.1.2
3|Active | 1|Apache Felix Gogo Runtime (0.16.2)|0.16.2
4|Active | 1|Apache Felix Gogo Command (0.16.0)|0.16.0
5|Active | 1|Apache Felix Gogo Shell (0.12.0)|0.12.0
6|Installed | 1|osgi.testplugin (1.0.0.SNAPSHOT)|1.0.0.SNAPSHOT
g! inspect req * 6
Bundle 6 is not resolved.
g! start 6
org.osgi.framework.BundleException: Unable to resolve ch.vorburger.minecraft.osgi.testplugin [8](R 8.0): missing requirement [ch.vorburger.minecraft.osgi.testplugin [8](R 8.0)] osgi.wiring.package; (osgi.wiring.package=org.spongepowered.api.command) Unresolved requirements: [[ch.vorburger.minecraft.osgi.testplugin [8](R 8.0)] osgi.wiring.package; (osgi.wiring.package=org.spongepowered.api.command)]
Я понимаю, что из-за асинхронной инициализации пакета OSGi может быть неочевидно, когда регистрировать неудачный запуск пакета, так как может потребоваться ожидание появления зависимых пакетов? Разве это не может все еще.. регистрировать такую ошибку после некоторого периода отсрочки?
2 ответа
У меня была похожая проблема в тестах, прежде чем я нашел опцию pax exam, чтобы проверить, что все пакеты разрешены.
То, что я сделал, было программно просмотреть список пакетов и вызвать start для каждого пакета, который не запущен. Затем bundle.start() генерирует исключение по причине, подобной приведенной выше команде консоли.
Не уверен, что Феликс может быть установлен, чтобы также регистрировать это по умолчанию.
Не уверен, что это лучшее решение, но оно мне помогло
import org.osgi.framework.*;
public class Activator implements BundleActivator, BundleListener {
public void start(BundleContext context) {
context.addBundleListener(this);
}
public void stop(BundleContext context) {
context.removeBundleListener(this);
}
@Override
public void bundleChanged(BundleEvent bundleEvent) {
if (bundleEvent.getType() == BundleEvent.UNRESOLVED) {
System.out.println("BUNDLE " + bundleEvent.getOrigin().getSymbolicName() + " UNRESOLVED");
try{
System.out.println("TRYING TO START " + bundleEvent.getOrigin().getSymbolicName() + " BUNDLE");
bundleEvent.getOrigin().start();
} catch (BundleException e) {
e.printStackTrace();
}
}
}
}
и добавить конфигурацию активатора в.bnd файл
Bundle-ClassPath: .
Bundle-Activator: com.netcracker.webportal.framework.activator.Activator
Import-Package: org.osgi.framework