2

我有一大堆在 OSGi 上运行良好的框架模块,所有服务和组件都可以相互找到并运行良好。

然而,有一个框架可以对类进行一些动态处理。基本上在某些时候你给它一个类名,它执行 Class.forName() 然后反射魔法发生。

这在标准 jvm 中运行并使用 SPI 将框架连接在一起时效果很好,但它在 OSGi 中失败,因为您尝试通过框架接近的随机类“test.MyTest”当然对所述框架不可见。

它将抛出“java.lang.ClassNotFoundException:框架未找到 test.MyTest”

所以我的问题是:如何解决需要查看所有内容的框架缺乏可见性?Import-Package: *?

更新

假设自 2010 年以来 OSGi 在这方面没有太大变化,文章http://njbartlett.name/2010/08/30/osgi-readiness-loading-classes.html非常有趣。我目前添加了对主动注册类和通过 OSGi 注入的域工厂的支持。

除此之外,默认解析无论如何都使用上下文类加载器,因此如果所有其他方法都失败,则将用于尝试加载类。

更新

我还添加了对建议DynamicImport-Package的支持,这对于小型项目来说更容易。

4

1 回答 1

4

您可以使用DynamicImport-Package:*。这将允许捆绑包查看所有类。问题是您无法真正控制所公开的内容。所以这通常是最后的手段,而不是推荐的方式。

您应该首先尝试使用 Thread.currentThread().setContextClassLoader() 并将其设置为您提供给框架的类的类加载器。有时框架也会参考这个类加载器。

更好的方法是在框架中找到允许提供用户类加载器的方法。

如果您可以控制代码,请避免使用 Class.forName()。相反,让用户给你一个类对象而不是一个类名,或者让用户给你一个类名和类加载器的组合来使用。这两种方式都可以在 OSGi 内外完美运行。

于 2014-11-07T11:39:35.153 回答