2010-06-26 15 views
16

Me siento un poco tonto aquí, pero no puedo hacer que Clojure Hello World compile.¿Compilando Clojure?

estructura de directorios:

hello-world/ 
    clojure-1.1.0.jar 
    build/ 
    classes/ 
    src/ 
    test/ 
     hello.clj 

hello.clj:

(ns test.hello 
    (:gen-class)) 

(defn -main [& args] 
    (println "Hello" (nth args 0))) 

Interacción:

$ cd hello-world 
[hello-world]$ java -cp ./clojure-1.1.0.jar:./build/classes:./src clojure.main 
Clojure 1.1.0 
user=> (require 'test.hello) 
nil 
user=> (test.hello/-main "there") 
Hello there 
nil 
user=> (compile 'test.hello) 
java.io.IOException: No such file or directory (hello.clj:2) 
user=> *compile-path* 
"classes" 
user=> (doseq [p (.split (System/getProperty "java.class.path") ":")] (println p)) 
./clojure-1.1.0.jar 
./build/classes 
./src 
nil 

, así que puede cargar y llamar al archivo de la REPL, pero doesn' t compilar.

Según clojure.org, compilación necesita

  • espacio de nombres debe coincidir con la ruta del archivo ruta de clases de relación - comprobar
  • * compile-ruta * debe estar en la ruta de clase - Comprobar
  • : argumento de clase generación de el formulario ns - cheque

Encontré this post from a year back, por lo que puedo decir que estoy haciendo exactamente lo mismo, pero no funciona.

¿Qué me estoy perdiendo?

Sistema: OS X 10.6, Java 1.6.0, Clojure 1.1

+0

Parece que no puedo aceptar mi propia respuesta, por lo que tendré que dejar la pregunta abierta hasta que alguien más entre en escena. –

+0

También es relevante tener en cuenta que rara vez necesita AOT compilar el código de Clojure. El código de Clojure funcionará perfectamente sin ser compilado, y esa es la forma en que debes ejecutarlo. Algunas funciones de interoperabilidad Clojure Java en realidad * requieren * que su código sea compilado AOT, pero si no está usando esas características, no se moleste en compilar su código. Si desea un archivo ejecutable, puede AOT compilar un archivo principal con solo una función principal para ejecutar la aplicación. Sin embargo, http://www.assembla.com/spaces/clojure/tickets/315-add-support-for-running--main-namespace-from-clojure-main-without-aot – Rayne

Respuesta

11

¿Por qué no se utiliza Leiningen? Es mucho más fácil usarlo, que compilar el código manualmente. Puede usar my article al respecto como introducción ...

+0

Lo he usado brevemente para descargar dependencias para proyectos externos, pero hasta ahora no se ha estudiado cómo usarlo como herramienta de compilación. Gracias por el enlace, lo comprobaré. –

+0

Descripción agradable, gracias por el artículo.Probablemente es hora de que empiece a usar una herramienta de compilación de todos modos :) –

+0

Leiningen no me ayuda: $ lein test No se pudo encontrar project.clj, que es necesario para la prueba – mcandre

20

Entendido, hay un cuarto requisito:

  • * * compile-ruta se resuelve en relación con las JVM directorio de trabajo, normalmente el directorio donde se inicia java O por REPL: (System/getProperty "user.dir"),

Así funciona esto:

user=> (set! *compile-path* "build/classes")  
"build/classes" 
user=> (compile 'test.hello) 
test.hello 
+0

Modificó la explicación, la primera estaba mal. La solución es la misma. –

+4

Para mí, (set! * Compile-path * ".") Es necesario para compilar CLJ en el directorio actual. – mcandre

+0

+1 Esto me ayudó ... ¡gracias! – OscarRyz