Проблемы реализации сканирования аннотаций с использованием Reflections в приложении RCP
Моей первой попыткой было просто включить банки в мое основное приложение. (Затмение 3.7) Я знаю, что это осуждается, но я пишу отдельное специализированное приложение, и я не слишком беспокоился о попытках разобраться в связках.
Попытавшись запустить это:
Reflections r = new Reflections("mypackage");
Set<Class<?>> activeActions = r
.getTypesAnnotatedWith(MyAnnotation.class);
В моем отдельном тестовом приложении это работало нормально, но при попытке в RCP я получил следующий вывод:
org.reflections.ReflectionsException: could not create Vfs.Dir from url,
no matching UrlType was found [bundleresource://1009.fwk651584550/]
either use fromURL(final URL url, final List<UrlType> urlTypes)
or use the static setDefaultURLTypes(final List<UrlType> urlTypes)
or addDefaultURLTypes(UrlType urlType) with your specialized UrlType.
Поэтому я искал ответ и нашел этот вопрос, который охватывает мою проблему, но не дает мне достаточно деталей для ее решения. В качестве первого шага я переместил пакеты отражения в пакет, но теперь, когда я запускаю его, я вообще ничего не получаю, я не знаю, из-за ли это плохих путей log4j или что-то еще, но сейчас я не получаю обратная связь от пакета отражений.
Мой список активных действий пуст, поэтому сканирование не сработало (и я этого не ожидал), поскольку я не реализовал вторую часть решения, а именно создание пользовательского типа UrlType. Однако теперь я реализовал пользовательский тип URL, и все еще ничего не найдено, я не знаю почему, потому что я не вижу никакой обратной связи с пакетом отражений, он просто ничего не находит.
Я надеюсь, что кто-то может помочь мне заставить работать регистрацию отражений, а затем выяснить, почему решение UrlType не работает для меня.
РЕДАКТИРОВАТЬ
Вот шутка: если я не заморачиваюсь с Bundle и просто помещаю фляги отражений в мой путь к классу, сканирование работает при условии, что пользовательский тип UrlType зарегистрирован. И регистрация все работает. Зачем мне мешать с Bundles?
1 ответ
Похоже, проблема с загрузкой классов в рамках OSGI. Вы должны помнить, что каждый пакет / плагин поддерживает свой собственный загрузчик классов, поэтому я думаю, что происходит то, что вы используете неправильные загрузчики классов для загрузки ваших классов, а ресурсы не решаются. Прежде всего, чтобы загрузить ваши классы в OSGI, это предложенный подход:
Получите Bundle/Plugin, который содержит ваш класс, выполнив этот Platform.getBundle("com.mybundle.id"); В экземпляре пакета есть метод с именем.loadClass(класс String);
Попробуйте загрузить свой MyAnnotation.class с подходом, который я только что упомянул, и посмотрите, что произойдет. Функция eclipse buddy-register в посте, на который вы ссылаетесь, полезна для таких вещей, как использование hibernate под OSGI, когда вы отображаете классы данных в вашем пакете и по умолчанию hibernate использует Class.forname() для загрузки класса, и это приводит к ошибке, потому что этот сопоставленный класс не находится на пути к классу библиотеки Hibernate. Не имеет смысла добавлять зависимость от плагина hibernate в ваш комплект, поэтому в манифесте комплекта hibernate вы устанавливаете eclipse-buddy-policy: зарегистрирован (не корректен по точному синтаксису), а затем в вашем пакете с сопоставленными классами вы регистрируете hibernate как приятель, и во время выполнения загрузчик классов hibernate будет иметь все классы в вашем комплекте на своем пути к классам.
Надеюсь, это даст вам представление о загрузке классов, что, похоже, является проблемой. Попробуйте загрузить ваши классы из экземпляра пакета not = new().