Как перекомпилировать и перезагрузить исходный код Java во время выполнения `lein repl`?

У меня есть проект Clojure, и я использую leiningen. Я также использую tools.namespace для перезагрузки кода Clojure во время выполнения REPL. Если я хочу включить источник Java в проект, могу ли я перекомпилировать и перезагрузить его во время работы REPL? Каков наиболее удобный/динамичный способ сделать это? Могу ли я сделать это так, чтобы он хорошо работал с tools.namespace?

Ответ 1

Я отвечаю на свою щедрость здесь, но я немного потрудился:

Используйте Vinyasa,

и вот сообщение в блоге:

Динамическая перезагрузка java-кода в emacs/nrepl

... на самом деле... он вроде бы не работает больше... вам нужно вернуться к более ранним версиям, чтобы получить поддержку.

Ответ 2

Spring -loaded или JRebel может быть тем, что вы хотите. Посмотрите https://github.com/spring-projects/Spring-loaded или http://zeroturnaround.com/software/jrebel/. Они оба предоставляют агента, контролирующего файловую систему для изменений файла класса и определения классов классов в запущенной JVM. Я лично использую Spring -loaded, но еще не вместе с tools.namespace. Я думаю, что ключом к их запуску является то, что они не конфликтуют. Поэтому, если вы используете Spring -loaded, это должны быть только файлы классов отслеживания файлов, и вам лучше не использовать aot вообще. Если я правильно помню, tools.namespace в любом случае отпугивает использование aot.

Ответ 3

В настоящее время (2016- > ) лучшим ответом является использование Virgil. Он автоматически отслеживает и перекомпилирует весь код Java в проекте leiningen в фоновом режиме, в отличие от подхода Vinyasa к вызову reimport.

Ответ 4

Чистый 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();
  }
}

таким образом вы можете заставить загрузчик классов загружать классы программно.

Ссылки

Ответ 5

См. также официальный загрузчик услуг JVM

ServiceLoader