Подтвердить что ты не робот

Почему Leiningen поддерживает свою собственную JVM?

Если я вызываю

lein trampoline repl

Leiningen запускает собственный процесс JVM, который затем запускает отдельную JVM для repl и quits. Однако вызов по умолчанию

lein repl

оставляет две запущенные JVM. Есть ли причина для поддержания подлинного процесса JVM Leiningen? Почему бы не сделать поведение lein trampoline по умолчанию и уйти каждый раз?

4b9b3361

Ответ 1

lein help trampoline:

Запустите задачу, не вложив проект JVM внутри Leiningen's.

Вычисляет код Clojure для запуска в процессе проекта для данной задачи и позволяет Leiningen самостоятельно запускать JVM-процесс запуская его, а не запуская подпроцесс JVM Leiningen.

Используйте это для экономии памяти или для устранения проблем с stdin.

Аргументы: ([имя задачи и аргументы])

Итак, вы можете видеть, без trampoline вторая JVM запускается как подпроцесс первого. Вот почему первый не может выйти - выход нарушит вторую.

С другой стороны, при trampoline первая JVM создает оболочку script, которая затем выполняется lein script, чтобы создать вторую JVM. Таким образом, в этом случае вторая JVM является дочерним элементом lein script. Как Clojure Младенцы сделаны: Leiningen Trampoline охватывает это довольно подробно.

Что касается того, почему trampoline не является значением по умолчанию, я не совсем уверен. Но помните, что не каждая команда lein запускает код проекта, поэтому вторая JVM не нужна для каждой команды.

Кроме того, могут быть недостатки в использовании trampoline. Например, взгляните на следующие строки кода из приведенной выше статьи:

# Just don't change :target-path in project.clj, mkay?
TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"

Для меня это означает, что могут возникнуть проблемы, если :target-path задано в project.clj.

Ответ 2

Это потому, что первый экземпляр устанавливает среду и передает другие требуемые параметры в реальный jvm, который продолжает работать.

Первый экземпляр JVM - это всего лишь своего рода оболочка, которая облегчает пользователям, в противном случае пользователь должен выполнять всю эту работу по передаче требуемых параметров на каждом этапе Exeution, который ни удобен для пользователя, ни выглядит хорошо с точки зрения безопасности.