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

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

当在标准jvm中运行并使用SPI将框架连接在一起时,此方法效果很好,但在OSGi中失败,因为当然,通过该框架尝试访问的随机类“ test.MyTest”对于该框架不可见。

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

所以我的问题是:我该如何解决需要全部查看的框架的可见性不足? Import-Package: *

更新

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

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

更新

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

最佳答案

您可以使用DynamicImport-Package:*。这将使捆绑包查看所有类。问题在于您无法真正控制什么内容。因此,这通常是不得已的方法,而不是推荐的方法。

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

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

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

10-06 08:31