2012-09-21 30 views
9

Estoy probando clojure en mi segundo día y todavía no entiendo casi nada. Estoy trabajando con Programming Clojure 2nd ed. y estoy atrapado con las bibliotecas.no se puede cargar una nueva biblioteca de clojure

Tengo Leiningen y tengo el REPL funcionando. El libro primero le dice al lector que ejecute un simple

(require 'clojure.java.io) 

que funciona bien (obtengo un cero). A continuación, se quiere cargar un archivo llamado introduction.clj ejecutando otra sencilla

(require 'examples.introduction) 

donde consigo un mensaje de error

FileNotFoundException Could not locate clojure/java/introduction__init.class 
or clojure/java/introduction.clj on classpath: clojure.lang.RT.load (RT.java:432) 

He descargado el archivo introduction.clj y hacia donde debería colocarlo. El error y el libro dicen que el comando buscará en mi classpath, pero no tengo ni idea de dónde ni qué es eso (después de 1 hora de búsqueda y lectura, todavía no lo entiendo, lo siento). Ejecuté algunos comandos y tenía muchos classpath enumerados (de los cuales ninguno contiene un clojure/java/io.clj).

Así que probó otro enfoque - encontrar el archivo io.clj en mi disco y simplemente copiar el archivo allí y ejecutarlo con un comando

(require 'clojure.java.introduction) 

Esto no parece funcionar bien. Por cierto, el archivo io.clj que encontré estaba en "C: \ Archivos de programa \ clojure \ src \ clj \ clojure \ java". Intenté ejecutar varios otros archivos .clj desde la carpeta java también desde la carpeta clojure, como javadoc.clj o inspector.clj y todos parecen funcionar bien con el comando mencionado anteriormente. Solo el nuevo archivo no parece cargarse de esta manera.

Cualquier ayuda apreciada :)

+0

¿qué es eso examples.introduction? un archivo jar o ra clj? – ssedano

Respuesta

6

Clojure se ejecuta en la máquina virtual de Java, por lo que tendrá que aprender un poco acerca de PATH y CLASSPATH conceptos:

Ver: http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

En cuanto el mensaje de error , el tiempo de ejecución de Clojure espera encontrar introduction.clj en el directorio clojure\java\example\introduction.clj (donde no debería estar, ver más abajo).

La convención para espacios de nombres Clojure es que el último componente es el nombre del archivo, mientras que los componentes anteriores son directorios principales. Así

clojure.java.introduction 

tendría que estar en el directorio (en relación a la fuente de "raíz" o ruta de clase)

clojure\java\introduction.clj 

(El Lein REPL añade automáticamente su raíz de origen a la ruta de clase).

Otro concepto que debe comprender es dónde se encuentra la "raíz" de su código fuente. Para Leiningen (la herramienta de compilación que está utilizando), el valor predeterminado es "src" o "src/main/clojure", como se documenta en Leiningen sample project file on GitHub).

Finalmente, si realmente te quedas atascado, parece que el proyecto completo para el libro is available on GitHub.

Mirando el proyecto, veo que en realidad se debe a colocar el archivo con src\examples\introduction.clj

+0

Gracias por la respuesta, leí el documento sobre los caminos y classpaths y me ayudó un poco. El problema aún permanece sin embargo. Traté de colocar el archivo literalmente en todas partes en la carpeta principal de clojure (y en las subcarpetas) y simplemente no funciona. ''examples.introduction' no funciona,'' clojure.examples.introduction' no funciona, para decirlo brevemente, no creo que este sea el problema. Todos los demás archivos clj se cargan correctamente desde las carpetas, pero cuando coloco el archivo introduction.clj allí no puede encontrarlo. En cualquier sitio. ¿Puede haber alguna otra razón para eso? Realmente no sé qué hacer. Gracias – xificurC

+1

También necesita '(ns examples.introduction)' en la parte superior del archivo clj. El espacio de nombre en el archivo generalmente necesita coincidir con la ubicación en el sistema de archivos. A menos que haya compilado previamente el código fuente de clojure en una clase Java y lo haya empaquetado en un contenedor (puede obtenerlo más adelante). – noahlz

+0

Incluso eso no ayuda. Incluso intenté llevar el archivo introduction.clj a la misma carpeta donde está el archivo io.clj. Ese funciona con el comando '(requiere 'clojure.java.io)' y su primera línea dice 'ns clojure.java.io'. Así que cambié la primera línea del archivo introduction.clj a 'ns clojure.java.introduction'. Quiero decir que debería funcionar, ¿verdad? Bueno, incluso eso no. Misma carpeta, misma ruta, pero no funciona. Estoy empezando a pensar que me salté la instalación de algo, aunque Leiningen debería encargarse de todo, ¿no? – xificurC

0

¿Está leyendo el libro "Programación Clojure"?

He encontrado el mismo problema. Se prohibición se sovled de la siguiente manera:

  1. Si clojure empezar por java: trabajo en ventanas, el clojure.jar se coloca en D: \ backup clojure-1.5.1 \, y el código fuente de la el libro "Programación Clojure" se coloca en D: \ study \ clojure \ shcloj-code \ code. Primero debe eliminar el archivo user.clj en la carpeta D: \ study \ clojure \ shcloj-code \ code.

java -cp d: \ backup \ clojure-1.5.1 \ clojure-1.5.1.jar; d: \ estudio \ clojure \ shcloj de código \ code clojure.main -r

Si trabajas en Linux, reemplaza el ";" con ":"

  1. Si inicia clojure por Lein primero debe cd a la carpeta D: \ estudio \ clojure \ shcloj código carpeta \ código, y luego

Lein repl

También debe eliminar el archivo user.clj en la carpeta D: \ study \ clojure \ shcloj-code \ code.

Cuestiones relacionadas