当`lein repl`正在运行时,如何重新编译和重新加载Java源代码?

时间:2013-12-09 08:23:48

标签: java clojure leiningen

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

5 个答案:

答案 0 :(得分:6)

我在这里回答了自己的赏金,但我确实做了一些工作:

使用Vinyasa

这是一篇博文:

Dynamic reloading of java code in emacs/nrepl

...实际上......它有点不再适用了......你必须回到早期版本才能获得支持。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

纯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();
  }
}

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

<强>参考

答案 4 :(得分:0)

另请参阅官方JVM服务加载器

ServiceLoader