2010-09-03 14 views
6

Aquí puedo comprobar la variable de entorno CLASSPATH
Daniel @ Daniel-laptop: ~/ps/clojure/proyectos/ring-tutoriales $ echo $ CLASSPATH
/home/Daniel/ps/clojure/proyectos/ring-tutorial/srcVariable de entorno CLASSPATH <> CLASSPATH de Clojure. ¿Por qué?

Aquí compruebo lo que java piensa que es.
Daniel @ Daniel-laptop: ~/ps/clojure/proyectos/ring-tutorial $ Lein repl
Clojure 1.1.0 user => (Sistema/getProperty "java.class.path")
"src/: classes /:/home/daniel/.m2/repository/leiningen/leiningen/1.1.0/leiningen-1.1.0-standalone.jar: lib/clojure-1.1.0.jar: lib/servlet-api-2.5- 6.1.14.jar: lib/commons-io-1.4.jar: lib/clj-stacktrace-0.1.0.jar: lib/clojure-contrib-1.1.0.jar: lib/ring-devel-0.2.0. jar: lib/jetty-util-6.1.14.jar: lib/clj-html-0.1.0.jar: lib/ring-jetty-adapter-0.2.0.jar: lib/jetty-6.1.14.jar: lib/ring-core-0.2.0.jar: lib/commons-fileupload-1.2.1.jar: lib/ring-servlet-0.2.0.jar: lib/commons-codec-1.4.jar: "

Como puede ver, las dos respuestas son completamente diferentes. Estoy bastante seguro de que debo estar malinterpretando dónde debería estar editando la variable CLASSPATH para que java lo "obtenga", excepto que todo lo que he encontrado dice que esto debería funcionar. Entonces, ¿cuál es el problema? ¿Leiningen engendra su propia extraña instancia renegada de clojure? ¿Estoy editando una variable completamente irrelevante? Cualquier ayuda muy apreciada.

+0

sugerencia: ve a la secuencia de comandos lein, a la que dices que abras tu respuesta. verás que hace algunas cosas con CLASSPATH – Belun

Respuesta

9

$CLASSPATH es completamente irrelevante aquí. Es lo que java -el programa JVM-launcher-usaría si no se le proporcionara información de classpath en la línea de comando; Leiningen proporciona a la JVM un classpath adecuado para cualquier proyecto en el que esté trabajando.

En este caso particular, "/home/.../ring-tutorial/src" no sería un classpath muy útil para el tutorial Ring, ya que solo incluye la fuente del tutorial Ring y no incluye el jarro Clojure (que es necesario para ejecutar el código Clojure), (Ring es un proyecto de varios módulos) o cualquiera de los otros jarros de los que depende Ring. El classpath producido por Leiningen puede parecer bastante largo, pero todos sus componentes realmente necesitan estar allí.

Por cierto, si recién está comenzando con Clojure, le recomiendo que se adhiera a las herramientas de gestión de rutas de clase de su cadena de herramientas (que podría significar Emacs + lein swank o algún IDE + el complemento Clojure) si es posible. De lo contrario, hay muchas preguntas sobre Clojure classpath aquí en SO, además de una multitud de otros recursos sobre el tema que puede buscar en google ... pero ahora esa herramienta de soporte es bastante robusta y normalmente no necesita para tocar classpath a mano, es el dolor mejor evitado al principio.

2

El problema con el uso de la variable CLASSPATH para administrar sus dependencias es que todos los lenguajes Java y otros lenguajes JVM tendrían que manipularlo para sus propósitos. No pasa mucho tiempo antes de que te hayas pintado en la esquina.

Funciona cuando se inicia un servidor que solo inicia un servidor. Se descompone por completo en una PC de un desarrollador de Java, que tiene 10 de programas y proyectos que necesitan dependencias diferentes y luego pasa más tiempo depurando scripts bash para manipular la variable CLASSPATH que escribir el código fuente.

Por lo tanto, esta forma de gestionar el classpath ha entrado en desuso, prefiriendo otras técnicas de carga de clases, o al usar CLASSPATH, solo usándolo muy localmente.

1

El classpath Clojure es el classpath de Java.

$CLASSPATH se ignora cuando el archivo ejecutable java se invoca con el argumento -cp, lo que hace Leiningen (y la mayoría de los otros scripts de construcción Clojure).

Si está utilizando una herramienta de compilación como Leiningen, debe usarla para administrar la ruta de clase.