OSGi中的类路径扫描

log*_*off 5 osgi classpath permgen

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

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

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

Bal*_*dos 7

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

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

  • 注释你的课程
  • 有一个MANIFEST头,必须列出带注释的类.

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

Provide-Capability: myNamespace;classes=com.foo.myClass1,com.foo.myClass2
Run Code Online (Sandbox Code Playgroud)

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

BundleWiring.getCapabilities("myNamespace");
Run Code Online (Sandbox Code Playgroud)

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

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

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