OSGi中的动态类加载

时间:2014-11-07 11:06:10

标签: java osgi classnotfoundexception spi dynamic-class-loaders

我有一大堆框架模块可以在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添加了支持,这对于小型项目来说更容易。

1 个答案:

答案 0 :(得分:4)

您可以使用DynamicImport-Package:*。这将允许bundle看到所有类。问题是你无法真正控制暴露的内容。所以这通常是最后的手段而不是推荐的方式。

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

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

如果您可以控制代码,那么请避免使用Class.forName()。相反,让用户给你一个类对象而不是类名,或者让用户给你一个类名和要使用的类加载器的组合。这两种方式在OSGi内外都能很好地发挥作用。