OSGi中的类路径扫描

时间:2014-04-14 15:58:14

标签: osgi classpath permgen

我的项目有一组自定义注释,可以在OSGi 4.3框架中部署的任何包中出现。我想在类路径中找到任何带有这些注释的类。我尝试对找到的每个课程使用BundleWiring.listResources(...)Bundle.loadClass(...)。我已经使用一小组bundle完成了一些测试,它需要大约200MB的Permanent Generation JVM内存空间,因为所有类都已加载。

当程序意识到他们没有这些注释时,有没有办法释放加载的类PermGen内存空间?

是否有更好的方法在OSGi框架中查找带注释的类?

2 个答案:

答案 0 :(得分:7)

我认为您不应该进行注释扫描,因为它会降低启动速度并需要大量内存。 JEE应用程序服务器在启动时进行注释扫描,使懒惰的程序员感到高兴,结果非常烦人(例如扫描JPA或EJB注释)。

我猜您正在实施一种可以定义规则的技术。我建议您应该定义与以下类似的规则:

  • 为您的课程添加注释
  • 有一个MANIFEST标题,其中必须列出带注释的类。

更好的解决方案是使用具有指定属性的自定义功能命名空间。 E.g:

Provide-Capability: myNamespace;classes=com.foo.myClass1,com.foo.myClass2

在您的技术中,您应该编写一个调用:

的BundleTracker
BundleWiring.getCapabilities("myNamespace");

如果存在名称空间,则可以找到应该处理的类。

如果您实施了该技术,则可以考虑对Bnd进行扩展,以自动填充该MANIFEST标头。可以使用该扩展名,而不是从命令行或maven等构建工具启动bnd时。

顺便说一句:您可以使用ASM来解析类字节码或使用Java的内置可能性build up AST。虽然这些可以解决内存问题,但我仍然认为您应该直接在MANIFEST头中定义类列表,因为它使事情更加清晰。您可以阅读MANIFEST标题,您可以检查webconsole上的功能,但不能对字节码执行相同的操作。

答案 1 :(得分:2)

通常,在OSGi上下文中,注释的类路径扫描是个坏主意,因为类路径更像是图形。但是,有些情况可能会有用。因此,OSGi鼓励使用Whiteboard Pattern

您可以做的是在OSGi注册表中将每个类注册为服务。然后,创建一个单独的包,它只跟踪这些服务并以某种方式转换/操作它们。例如,this项目扫描所有使用@Path和@Provider注释注释的类,并将它们转换为Jersey REST API。

相关问题