【问题标题】:Runtime Compilation运行时编译
【发布时间】:2013-09-17 09:24:12
【问题描述】:

在运行时编译 java 类以在不停止服务器的情况下更新项目是个好主意吗?

我的下一个问题是:我可以替换现有对象的类吗?我的意思是在不重新创建对象的情况下更新一些方法行为。

【问题讨论】:

  • 您可以使用调试 API 来完成,但在生产环境中这样做并不是一个好主意。
  • 更好的办法是使用像 OSGi 这样的模块化框架,然后您可以在运行时替换系统的某些部分。

标签: java runtime dynamic-compilation


【解决方案1】:

在运行时编译java类以更新项目是个好主意吗 不停止服务器?

我相信您的意思是在不停止服务器的情况下更新新编译的类。您总是可以这样做,但如果该类已经加载,那么它不会有任何区别,jvm 将继续使用该类的旧版本。

下一个问题是:我可以替换现有对象的类吗?一世 意思是在不重新创建对象的情况下更新一些方法行为。

与第一个问题的答案相同。如果该类已加载,则 JVM 将使用旧方法/行为。如果你有一些类的对象,这意味着它已经被加载了。

【讨论】:

  • 可以卸载类,但这仍然是一个糟糕的解决方案。
  • 对于第一个问题,如果更新,我可以创建类加载器工厂并在新类加载器中加载新类。但这是允许的开发人员方法吗?
  • @ОлександрСамсонов 我相信有时这样做是允许且合乎逻辑的。我相信一些容器比如 Websphere 提供了热部署,这意味着一旦更新类就会被加载。
【解决方案2】:

我会让重新部署过程变得如此之快,这并不重要。 (这并不总是一种选择)但我尽量确保我可以在 10 秒内编译、重新部署和重新启动服务器进程。在这种情况下,您不需要动态编译。

注意:如果您调试系统并重新编译代码,您可以从 IDE 热交换正在运行的系统的更改。 (通常有效,但有时不取决于您更改的内容)

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多