ejemplos - clojure tutorial español
¿Por qué Leiningen mantiene funcionando su propia JVM? (2)
Esto se debe a que la primera instancia configura el entorno y pasa otros parámetros necesarios al jvm real que sigue funcionando.
La primera instancia de JVM es simplemente una especie de envoltorio que es fácil para los usuarios, de lo contrario el usuario tiene que hacer todo el trabajo de pasar los parámetros necesarios en cada punto de ejecución, que no es amigable ni se ve bien desde el punto de vista de la seguridad.
Si llamo
lein trampoline repl
Leiningen lanza su propio proceso de JVM que luego inicia una JVM separada para el repl y se cierra. Sin embargo, llamar al predeterminado
lein repl
deja dos JVMs ejecutándose. ¿Hay alguna razón para mantener en funcionamiento el proceso original de JVM de Leiningen? ¿Por qué no hacer que el comportamiento del lein trampoline
el predeterminado y salir cada vez?
lein help trampoline
states:
Ejecute una tarea sin anidar la JVM del proyecto dentro de Leiningen.
Calcula el código de Clojure para ejecutar en el proceso del proyecto para la tarea dada y permite que el propio proceso de JVM de Leiningen salga antes de ejecutarlo en lugar de iniciar un subproceso de la JVM de Leiningen.
Use esto para ahorrar memoria o para resolver problemas de stdin.
Argumentos: ([nombre-tarea & args])
Entonces puede ver, sin trampoline
la segunda JVM se ejecuta como un subproceso de la primera. Es por eso que el primero no puede salir: salir interrumpiría el segundo.
Por otro lado, con el trampoline
la primera JVM construye un script de shell que luego ejecuta el script lein
para generar la segunda JVM. Entonces, en este caso, la segunda JVM es hija del script lein
. Cómo se fabrican los bebés Clojure: el Trampoline de Leiningen lo cubre con bastante detalle.
En cuanto a por qué el trampoline
no es el predeterminado, no estoy del todo seguro. Pero recuerde que no todos los comandos lein
ejecutan código de proyecto, por lo que la segunda JVM no es necesaria para cada comando.
Además, puede haber desventajas al usar trampoline
. Por ejemplo, eche un vistazo a las siguientes líneas de código del artículo anterior:
# Just don''t change :target-path in project.clj, mkay?
TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"
Para mí, eso implica que podría haber problemas si :target-path
se establece en project.clj
.