繁体   English   中英

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

[英]How do I recompile and reload Java source code while `lein repl` is running?

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

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

使用Vinyasa

这是一篇博文:

在emacs / nrepl中动态重新加载java代码

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

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

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

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

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

参考

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

的ServiceLoader

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM