簡體   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