У меня есть проект Clojure, и я использую leiningen. Я также использую tools.namespace для перезагрузки кода Clojure во время выполнения REPL. Если я хочу включить источник Java в проект, могу ли я перекомпилировать и перезагрузить его во время работы REPL? Каков наиболее удобный/динамичный способ сделать это? Могу ли я сделать это так, чтобы он хорошо работал с tools.namespace?
Как перекомпилировать и перезагрузить исходный код Java во время выполнения `lein repl`?
Ответ 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