【问题标题】:Classpath scanning in OSGiOSGi 中的类路径扫描
【发布时间】:2014-05-28 16:28:41
【问题描述】:

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

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

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

【问题讨论】:

  • 你想用这些带注释的类做什么?
  • @Aritra 我基本上想找到它们,以使用这些类中的信息触发其他操作。类似的情况可能是基于 JAX-RS/JAXB 注释准备 Web 服务。无论如何,这是一个普遍的问题。
  • 我一直在过滤要扫描的包,只从导入注释包的包中加载类。我正在使用BundleWiring.getRequiredWires(null) 并使用BundleWire.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE).equals(packageName) 寻找我的包裹。它减少了很多内存消耗和加载类所花费的时间。这似乎不是更好的方法,但它大大简化了流程。

标签: osgi classpath permgen


【解决方案1】:

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

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

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

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

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 上检查功能,但不能对字节码执行相同操作。

【讨论】:

  • 您当然应该使用 ASM(或等效的)直接扫描字节码,而不是加载类然后使用反射来检查注释。
  • 这个回复给了我有价值的信息,但没有回答我的两个问题。我的意思是,这是一个好主意,但我想像我在问题中所说的那样注释我的课程。
  • 基于答案:如果你真的想扫描所有的类,使用ASM来分析它们的字节码。在这种情况下,你不会有 PermGen 的问题。但是,最好强制程序员在 Provide-Capability MANIFEST 标头中列出带注释的类。在这种情况下,您可以使用 bundleWiring.getClassLoader().loadClass(),因为您不会用所有类填充 Permgen,而只会使用肯定有注释的类(并且无论如何都会加载这些类)。
【解决方案2】:

通常,在 OSGi 上下文中,对注释进行类路径扫描不是一个好主意,因为类路径更像是一个图。但是,在某些情况下这可能很有用。因此,OSGi 鼓励使用Whiteboard Pattern

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多