2

我的第一次尝试是简单地将罐子包含在我的主应用程序中。(Eclipse 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 路径错误还是什么,但我现在没有来自反射包的反馈。

我的 activeActions 列表是空的,所以扫描没有奏效(我没想到会这样),因为我没有实现解决方案的第二部分,即创建自定义 UrlType。但是,我现在已经实现了自定义 URL 类型,但仍然没有找到任何东西,我不知道为什么,因为我看不到反射包的任何反馈,只是没有找到任何东西。

我希望有人可以帮助我让反射日志记录正常工作,然后找出为什么 UrlType 解决方案不适合我。

编辑

这是一个笑话,如果我不打扰 Bundle 并且我只是将反射 jar 推到我的类路径中,那么只要注册了自定义 UrlType,扫描就可以工作。并且记录一切正常。我为什么要打扰 Bundles?

4

1 回答 1

0

这看起来像是 OSGI 框架下的类加载问题。您必须记住,每个包/插件都维护自己的类加载器,所以我认为您正在使用错误的类加载器来加载您的类并且资源没有得到解决。首先在 OSGI 中加载你的类,这是建议的方法:

通过执行此 Platform.getBundle("com.mybundle.id"); 获取包含您的类的 Bundle/Plugin;在 bundle 实例上有一个名为 .loadClass(String class); 的方法。

尝试使用我刚才提到的方法加载您的 MyAnnotation.class,看看会发生什么。您引用的帖子中的 eclipse buddy-register 功能对于诸如在 OSGI 下使用 hibernate 之类的事情很有用,您映射的数据类在您的包中,默认情况下,hibernate 使用 Class.forname() 加载类,它会遇到错误,因为该映射类不在休眠库包的类路径上。将对休眠插件的依赖添加到您的捆绑包是没有意义的,因此在休眠捆绑包的清单中设置 eclipse-buddy-policy:registered (在确切语法上不正确)然后在您的捆绑包中使用映射类将休眠注册为一个伙伴,在运行时,休眠类加载器将在其类路径上包含您的包中的所有类。

希望这能让您了解类加载,这似乎是问题所在。尝试从包实例 not = new() 加载您的类。

于 2012-11-09T22:10:30.673 回答