【问题标题】:How do I recompile and reload Java source code while `lein repl` is running?如何在 `lein repl` 运行时重新编译和重新加载 Java 源代码?
【发布时间】:2013-12-26 07:08:01
【问题描述】:

我有一个 Clojure 项目,我正在使用 leiningen。我还在运行 REPL 时使用 tools.namespace 重新加载 Clojure 代码。如果我想在项目中包含 Java 源代码,我可以在 REPL 运行时重新编译并重新加载它吗?最方便/最动态的方式是什么?我可以这样做以便它与 tools.namespace 一起工作吗?

【问题讨论】:

标签: java clojure leiningen


【解决方案1】:

我在这里回答我自己的赏金问题,但我确实做了一些工作来解决这个问题:

使用Vinyasa

这是一篇博文:

Dynamic reloading of java code in emacs/nrepl

...实际上...它有点不工作了...您必须回到早期版本才能获得支持。

【讨论】:

  • 这个库已经被完全删除,以及它的替代品,Lucidity。
  • 它仍然在 clojars 上......只是非常不受支持。 virgil 现在绝对是更好的选择。
【解决方案2】:

现在(2016->)更好的答案是使用Virgil。它会在后台自动监视和重新编译您的 leiningen 项目中的所有 Java 代码,这与 Vinyasa 调用重新导入的方法不同。

【讨论】:

  • 你没有得到足够的信任,现在这绝对是正确的答案:)
【解决方案3】:

弹簧加载或 JRebel 可能是您想要的。看看https://github.com/spring-projects/Spring-loadedhttp://zeroturnaround.com/software/jrebel/。它们都提供了一个代理来监视文件系统中的类文件更改并更新正在运行的 JVM 中的类定义。我个人使用 Spring-loaded,但尚未与 tools.namespace 一起使用。我想运行它们的关键是确保它们不冲突。所以如果你使用 Spring-loaded,它应该是唯一的工具跟踪类文件,你最好不要使用 aot。如果我没记错的话,tools.namespace 无论如何都不鼓励使用 aot。

【讨论】:

    【解决方案4】:

    纯java方式

    public class MyClassFactory {
       public static MyClass newInstance() {
           URLClassLoader cl =
               new URLClassLoader(new URL[] {getMyClassPath()}) {
    
               public Class loadClass(String name) {
                  if ("MyClass".equals(name))
                     return findClass(name);
                  return super.loadClass(name);
              }
           };
    
         return (MyClass) cl.loadClass("MyClass").newInstance();
      }
    }
    

    通过这种方式,您可以引导类加载器以编程方式加载类。

    参考文献

    【讨论】:

      【解决方案5】:

      另见官方 JVM 服务加载器

      ServiceLoader

      【讨论】:

        猜你喜欢
        • 2015-12-09
        • 2021-05-21
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多