OSGi中的类路径扫描

OSGi中的类路径扫描,osgi,classpath,permgen,Osgi,Classpath,Permgen,我的项目有一组自定义的注释,可以出现在OSGi4.3框架中部署的任何捆绑包中。我想在类路径中找到任何带有这些注释的类。我试着为找到的每个类使用和。我已经用一小部分bundle做了一些测试,它需要大约200MB的永久生成JVM内存空间,因为所有类都已加载 当程序意识到加载的类没有这些注释时,有没有办法释放它们的内存空间? 有没有更好的方法在OSGi框架中查找带注释的类?我认为您不应该进行注释扫描,因为它会减慢启动速度并需要大量内存。JEE应用服务器在启动时进行注释扫描,以使懒惰的程序员感到高兴,结

我的项目有一组自定义的注释,可以出现在OSGi4.3框架中部署的任何捆绑包中。我想在类路径中找到任何带有这些注释的类。我试着为找到的每个类使用和。我已经用一小部分bundle做了一些测试,它需要大约200MB的永久生成JVM内存空间,因为所有类都已加载

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


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

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

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

  • 给你的班级做注解
  • 具有必须在其中列出注释类的清单标头
更好的解决方案是使用具有指定属性的自定义功能命名空间。例如:

Provide-Capability: myNamespace;classes=com.foo.myClass1,com.foo.myClass2
在您的技术中,您应该编写一个BundleTracker,它调用:

BundleWiring.getCapabilities("myNamespace");
如果名称空间存在,您可以找到应该处理的类

如果您实现了该技术,可以考虑BND的扩展来自动填充清单清单。与从命令行或maven等构建工具启动bnd相比,可以使用该扩展


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

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


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

您当然应该使用ASM(或等效工具)直接扫描字节码,而不是加载类,然后使用反射检查注释。此响应为我提供了有价值的信息,但没有回答我的两个问题。我的意思是,这是一个好主意,但我想像我在问题中所说的那样注释我的类。根据答案:如果你真的想扫描所有的类,使用ASM分析它们的字节码。在这种情况下,PermGen不会有问题。但是,最好强制程序员在提供功能清单头中列出带注释的类。在这种情况下,您可以使用bundleWiring.getClassLoader().loadClass(),因为您不会用所有类填充Permgen,而只填充那些肯定有注释的类(这些类无论如何都会被加载)。您想用这些注释的类做什么?@Aritra我基本上想找到它们,使用这些类中的信息触发其他操作。类似的情况可能是基于JAX-RS/JAXB注释准备web服务。无论如何,这是一个普遍的问题。我一直在筛选要扫描的包,只从包中加载类,导入注释包。我正在使用
BundleWiring.getRequiredWires(null)
和使用
BundleWire.getCapability().getAttributes().get(bundleVision.package_NAMESPACE).equals(packageName)
查找我的包。它大大减少了内存消耗和加载类的时间。这似乎不是更好的方法,但它大大简化了过程。