заводная консоль в osgi - PullRequest
       16

заводная консоль в osgi

0 голосов
/ 27 апреля 2011

Мне удалось встроить стандартную Groovy-консоль в Felix и выставить ряд переменных (например, BundleContext и т. Д.).

Однако при «первом» запуске моего комплекта чертежей я получил эту ошибку:

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_24]
  ... ... ...
    at groovy.util.FactoryBuilderSupport.callAutoRegisterMethods(FactoryBuilderSupport.java:202)[groovy-all-1.7.8.jar:1.7.8]
    ... 42 more
Caused by: java.lang.NoClassDefFoundError: sun/reflect/ConstructorAccessorImpl
    at sun.misc.Unsafe.defineClass(Native Method)[:1.6.0_24]
    ... ... ...
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)[:1.6.0_24]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)[:1.6.0_24]
    ... ... ...
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:153)[groovy-all-1.7.8.jar:1.7.8]
    at groovy.swing.SwingBuilder.registerActionButtonWidgets(SwingBuilder.groovy:94)[groovy-all-1.7.8.jar:1.7.8]
    ... 47 more
Caused by: java.lang.ClassNotFoundException: *** Package 'sun.reflect' is not imported by bundle groovy-all [18], nor is there any bundle that exports package 'sun.reflect'. However, the class 'sun.reflect.ConstructorAccessorImpl' is available from the system class loader. There are two fixes: 1) Add package 'sun.reflect' to the 'org.osgi.framework.system.packages.extra' property and modify bundle groovy-all [18] to import this package; this causes the system bundle to export class path packages. 2) Add package 'sun.reflect' to the 'org.osgi.framework.bootdelegation' property; a library or VM bug can cause classes to be loaded by the wrong class loader. The first approach is preferable for preserving modularity. ***
    at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1782)[org.apache.felix.framework-3.0.9.jar:]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)[:1.6.0_24]
    at org.codehaus.groovy.runtime.callsite.CallSiteClassLoader.loadClass(CallSiteClassLoader.java:51)[groovy-all-1.7.8.jar:1.7.8]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)[:1.6.0_24]
    at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.loadClass(ClassLoaderForClassArtifacts.java:58)[groovy-all-1.7.8.jar:1.7.8]
    ... 65 more
Caused by: java.lang.ClassNotFoundException: sun.reflect.ConstructorAccessorImpl not found by groovy-all [18]
    at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:787)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.ModuleImpl.access$400(ModuleImpl.java:71)[org.apache.felix.framework-3.0.9.jar:]
    at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1768)[org.apache.felix.framework-3.0.9.jar:]
    ... 69 more

За исключением того, что мой пакет теперь активен.Однако консоли не показывают.Если я остановлюсь и снова начну сборку, ошибка больше не будет отображаться, и я смогу увидеть и использовать мою качающуюся консоль Groovy.

Трассировка стека указывает следующие варианты решения этой проблемы:

  1. Добавить пакет 'sun.reflect' в свойство 'org.osgi.framework.system.packages.extra' и изменить пакет groovy-all [18] для импорта этого пакета;это заставляет системный пакет экспортировать пакеты путей к классам.

  2. Добавить пакет 'sun.reflect' в свойство 'org.osgi.framework.bootdelegation';ошибка библиотеки или виртуальной машины может привести к загрузке классов неправильным загрузчиком классов.Первый подход предпочтителен для сохранения модульности.*

Я совершенно уверен, что с вариантом 2 ошибка исчезнет.

Однако мой вопрос ... если sun.reflect не импортируется, почему Groovy консоль отображается после перезапуска пакета?Цените совет от любого с таким опытом.

1 Ответ

0 голосов
/ 28 апреля 2011

Вариант 1 является правильным решением проблемы. Ваш пакет зависит от пакета sun.reflect, поэтому вы должны сделать это явным образом в операторе Import-Package.

Понятия не имею, почему консоль может отображаться после перезапуска. Он может выполнить свое внутреннее «переключение при сбое» в случае, если он не может загрузить пакет sun.reflect. Я не стал бы сильно беспокоиться об этом аспекте, просто включите его, добавив импорт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...