【问题标题】:OSGi restart: Are modified class files considered?OSGi 重启:是否考虑修改的类文件?
【发布时间】:2014-08-23 08:05:39
【问题描述】:

OSGi-Bundle 在重新启动时是否考虑其更改的类文件?我的意图是停止一个 Bundle,更改它的 java 文件,编译它,然后重新启动该包。它是否包含新类或者我需要以某种方式更新捆绑包?

这两个线程让我想出了这个想法: Editing/Modifying a .java file programmatically? (not the .class file)How do I programmatically compile and instantiate a Java class?

很高兴得到帮助。谢谢。

【问题讨论】:

  • 您为什么想要或需要这样做?按照其他人的方式进行操作,使用semantic versioning 并安装新版本,卸载旧版本并刷新。 (如果你使用的是 Karaf 和 Maven,你可以简单地 watch 捆绑包,它会随着它的变化自动更新)。
  • 我的项目的目标是自动执行此操作。由于性能要求,动态映射器类是自动构建的。我知道这是一个非常特殊的情况,但对于这项工作来说是必要的。每次在基于事件的系统中有新的聚会时,都需要更新类...您不想手动执行此操作...您的语义版本控制链接给了我一个 404 btw。
  • 回复:404,www.osgi.org/wiki/uploads/Links/SemanticVersioning.pdf。如果我担心性能,我不会选择需要在运行时修改和编译的设计。
  • “每次在基于事件的系统中出现新的聚会时,都需要更新类” 这是一个主要的设计问题,您的代码违反了Open/Close Principle
  • 好吧,也许是有误会。系统启动后加入的人不多。因此,使用类中的方法进行映射比每次发生事件时从数据库中查找信息要快...无论如何,您会对您的方法感兴趣...

标签: class compilation osgi osgi-bundle


【解决方案1】:

必须刷新或更新捆绑包才能获得新的类加载器。简单地重新启动一个包将使用当前的类加载器,它仍然会加载原始类。

【讨论】:

  • 感谢您的回答。所以即使类文件被替换了,它仍然有旧的类文件在内存中?这个过程是如何运作的?那么它会是一种以编程方式更新捆绑包的解决方案吗? (停止捆绑,以编程方式更新内容,更新捆绑,启动捆绑)这可能吗?
  • 只需替换捆绑包 jar 并以编程方式更新捆绑包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2013-09-23
相关资源
最近更新 更多