Clojure nicht finden können .clj im lokalen Verzeichnis . und ./Klassen auf dem KLASSENPFAD
Wenn ich auswerten (verwenden Sie 'Hallo) zu laden Hallo.clj, REPL beschwert sich mit der folgenden Fehlermeldung:
java.io.FileNotFoundException: Could not locate hello__init.class or hello.clj on classpath: (NO_SOURCE_FILE:0)
Ich bin Anrufung der REPL so:
java -cp "/Library/Java/Extensions/servlet-api-2.5-20081211.jar:... lots of jarfiles ...:/Library/Java/Extensions/clojure-contrib.jar:/Library/Java/Extensions/clojure-1.0.0.jar:./classes/:." jline.ConsoleRunner clojure.lang.Repl
Lesen herum, das sieht aus wie die Datei, die nicht gefunden wird in der PWD, aber ich Hinzugefügt habe . der Weg ohne Erfolg :-(.
Läuft mit Java 1.6 auf OS X 10.6.
Ich bin sicher, ich bin ein idiot, kann mir jemand traf mich mit ein LART?
EDIT: ich habe auch versucht, die ClojureX - Distribution, und bekam die gleichen Ergebnisse.
- Welche Ausgabe erhalten Sie von: (println (seq (.getURLs (java.lang.ClassLoader/getSystemClassLoader))))
- Aus meiner Clojure-Verzeichnis (/Users/ben/Documents/Code/Clojure), bekomme ich diese: (#<URL: file:/Library/Java/Extensions/servlet-api-2.5-20081211.jar> ... mehr urls für jarfiles ... #<URL: file:/Library/Java/Extensions/clojure-1.0.0.jar> #<URL: file:/Users/ben/Documents/Code/Clojure/Klassen> #<URL: file:/Users/ben/Documents/Code/Clojure/>)
- da ich nicht nochmals ausdrücklich vereinbart werden überall noch, und es könnte von Bedeutung sein, wo ist die Hallo.clj Datei? auch, was passiert, wenn Sie Sie ausführen (kompilieren 'Hallo)?
- Hallo.clj ist in meinem PWD (was für alle meine Experimente wurde ~/Dokumente/Code/Clojure/).
- (compile 'Hallo) gibt den gleichen Fehler wie (mit 'Hallo), und zwar: java.io.FileNotFoundException: Konnte nicht gefunden werden hello__init.class oder Hallo.clj auf classpath: (NO_SOURCE_FILE:0)
- Richtig, zwei Fragen mehr, obwohl ich wirklich das Gefühl, an einem Verlust, was geschehen könnte. Erstens, die version von Clojure verwenden Sie? Zweitens tut all dies immer noch passieren, mit einem minimal-classpath (nur clojure.jar und eine minimale .clj-Datei in $PWD, wie das 'hello' - Beispiel in meiner Antwort?)? BTW, clojure.lang.Repl ist offenbar veraltet, in den neueren builds, mit clojure.main statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
hello.clj
ist in$DIR
und$DIR
ist auf Ihrem classpath, dannhello.clj
starten muss, um mit(ns hello)
. Wenn es in$DIR/$SUBDIR
und$DIR
ist auf Ihrem classpath, dann Hallo.clj starten muss, um mit(ns $SUBDIR.hello)
. In der Regel mit dem Namen der Struktur und den ns-Namen-Struktur entsprechen muss, mit dem Dateinamen Trennzeichen ersetzt durch.
im ns-Namen und_
s in den Dateinamen entsprechend-
s in der ns-Namen. Der name der eigentlichen Datei, muss die Letzte Komponente (vermutlich die einzige Komponente, wenn die Datei mit dir im classpath) der namespace name.EDIT:
Erweitertes Beispiel. Keine Informationen über das, was ich oben geschrieben hab, also bitte überspringen, wenn das war genug für Sie; aber ich weiß, dass der erste CP rechts war ziemlich schmerzhaft für mich am Anfang, so dass ich dachte, ich Schreibe dies in einer Schritt für Schritt-Mode, so dass jemand, irgendwo, könnte vielleicht geschont werden, dass insbesondere die "Lern-Erfahrung"; -).
Sagen, das ist Ihre namespace-definition:
Dann, wenn Sie das Verzeichnis mit
hello.clj
auf Ihrem classpath, du bist gut zu gehen und ein(use 'hello)
an der REPL sollte das tun, was Sie wollen.Wenn auf der anderen Seite, Sie dies tun:
oder so:
-- das heißt, wenn Sie einführen eine Diskrepanz zwischen dem Namen der Datei und den Namen des namespace Clojure nicht in der Lage zu finden, Ihren Namensraum.
Auch, wenn Sie
hello.clj
im/path/to/code
, aber was haben Sie auf Ihrem classpath ist eigentlich/path/to
, d.h. das übergeordnete Verzeichnis von/path/to/code
, die Sie brauchen, um dies zu tun:Dann werden Sie in der Lage zu
(use 'code.hello)
.Schließlich, wenn Sie rufen Sie Ihren Datei
my_namespace.clj
Sie müssen rufen Sie Ihren nsmy-namespace
(und Umgekehrt)._
s in namespace-Namen und-
s in Dateinamen nicht verwendet werden sollte.load-file
zu brechen einen namespace in mehrere Stücke#include "foo.h"
Stil. Ich habe noch einen Fall, wo dies besonders nützlich ist, obwohl, soweit ich das beurteilen kann, ein paar sub-namespaces würde dazu neigen, zu erreichen, viel die gleiche Sache in eine sauberere Möglichkeit (und es gibt keinen Grund, nicht zu re-exportieren Sie Ihre öffentlichkeiten aus einem einzigen namespace dienen als Zugangspunkt für die Verbraucher des Kodex). Für den Dateisystem-Pfad-classpath Kupplung, ich denke eher, es ist eine gute Idee. Haskell & Python sind zwei Beispiele von Sprachen, die wohl gut mit dieser Wahl.Tut Hallo.clj enthalten
(ns some-namespace)
Aussage? Wenn dem so ist, dannsame_namespace
ist angehängt, um jedes element der CLASSPATH vor der Suche nach Hallo.cljwenn ich arbeiten bin aus der repl und wollen, um Dateien zu laden, ich finde, ich habe zu nennen, so etwas wie das erste:
bevor die repl finden Sie auf dem Klassenpfad.
Ich habe diese Datei nicht in der jar-Datei zusammen mit einer Anweisung, der lädt alles von der anderen Dateien. Wenn ich build eine jar-Datei, die ich finde ich brauche nicht, dies zu tun.
Habe ich definiert einen alias (in .bash_profile) für das laden der REPL:
Habe ich folgende Zeilen auf meinem .emacs:
Ich lade das Programm snake.clj, die unter ~/src/clj und eval (C-x h wählt den gesamten Puffer-und dann C-c C-c zu kompilieren). Die Programme erstellt ein namespace-name Schlange. Nun, aus emacs/slime, ich
Das ist es.Jetzt rufen Sie eine beliebige Funktion definiert im namespace.
Dein problem kann sein, dass das Verzeichnis, in dem Sie haben, Hallo.clj möglicherweise nicht auf Ihrem Klassenpfad befinden. Auch stellen Sie sicher, dass Sie den Namen des namespace richtig. Wenn innerhalb Hallo.clj, Sie mit dem Namen Ihr name Raum als Hallo, dann machst du (mit 'Hallo).