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

15

我有一个Clojure项目,正在使用leiningen。同时,我也在运行REPL时使用tools.namespace重新加载Clojure代码。如果我想在项目中包含Java源代码,那么我可以在REPL运行时重新编译和重新加载它吗?最方便/动态的方法是什么?我能否使其与tools.namespace良好配合使用?


也许在 project.clj 中添加 :aot :all - halfelf
@halfelf 那不像是我想要的。 - oskarkv
我正在寻找完全相同的东西。如果实现了这个功能,那将是一个巨大的胜利。在 https://github.com/technomancy/leiningen/blob/cd22728f21132fe986a614205ef5fd18beea91dd/src/leiningen/javac.clj 中有一个 javac 函数,它包含在 leiningen 中。 - zcaudate
这个网址 https://dev59.com/fW035IYBdhLWcg3wbPU5 有帮助吗? - toolkit
5个回答

7
我在这里回答自己的赏金问题,但我确实做了一些工作来完成这个任务:
使用Vinyasa
这里是一篇博客文章: Emacs/nrepl中Java代码的动态重新加载 ... 实际上... 它有点不再起作用了... 你必须退回到早期版本才能得到支持。

这个库已经完全被移除了,包括它的替代品 Lucidity。 - gleenn
它仍然在Clojars上...但是非常不受支持。Virgil现在绝对是更好的选择。 - zcaudate

6

现在(2016年及以后),更好的解决方案是使用Virgil。它会自动监视并编译您Leiningen项目中的所有Java代码,而不像Vinyasa需要手动重新导入。


你没有得到足够的赞誉,但这绝对是正确的答案 :) - gleenn

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

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

通过这种方式,您可以编程地引导类加载器来加载类。
参考资料:
- Classloader官方文档 - Java规范 - OnJava

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接