我有一个Clojure项目,我正在使用leiningen。我也在使用tools.namespace在运行REPL时重新加载Clojure代码。如果我想在项目中包含Java源代码,我可以在REPL运行时重新编译并重新加载吗?这样做最方便/最动态的方法是什么?我可以这样做,以便它与tools.namespace一起使用吗?
答案 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-loaded或http://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服务加载器