2010-09-03 12 views
6

Hier prüfe ich die Umgebungsvariable CLASSPATH
daniel @ daniel-Laptop: ~/ps/clojure/projects/Ring-Tutorials $ echo $ CLASSPATH
/home/daniel/ps/clojure/projects/Ring-Tutorial/srcUmgebungsvariable CLASSPATH <> Clojures CLASSPATH. Warum?

Hier überprüfe ich, was Java denkt, ist es.
daniel @ daniel-Laptop: ~/ps/clojure/projects/Ring-Tutorial repl $ lein
Clojure 1.1.0 user => (System/getProperty "java.class.path")
„src/: Klassen /:/home/daniel/.m2/repository/leiningen/leiningen/1.1.0/leiningen-1.1.0-alone.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-Dateiupload-1.2.1.jar: lib/ring-servlet-0.2.0.jar: lib/commons-codec-1.4.jar: "

Wie Sie sehen können, sind die beiden Antworten völlig unterschiedlich. Ich bin mir ziemlich sicher, dass ich nur falsch verstanden habe, wo ich die CLASSPATH-Variable bearbeiten sollte, damit Java es "bekommt", außer dass alles, was ich gefunden habe, sagt, dass das funktionieren sollte. Also, was ist der Deal? Lässt Leiningen eine eigene, seltsame, abtrünnige Instanz von Clojure entstehen? Bearbeiten Sie eine völlig irrelevante Variable? Jede Hilfe wird sehr geschätzt.

+0

hinweis: gehen sie auf das lein-skript, auf das sie sagen, dass sie ihre repl öffnen. Sie werden sehen, dass es mit CLASSPATH einige Sachen macht – Belun

Antwort

9

$CLASSPATH ist in der Tat hier völlig irrelevant. Es ist das, was java-das-JVM-Launcher-Programm verwenden würde, wenn es in der Befehlszeile keine Classpath-Informationen bereitgestellt wurde; Leiningen stellt der JVM einen Klassenpfad zur Verfügung, der für jedes Projekt geeignet ist, an dem Sie gerade arbeiten.

In diesem speziellen Fall wäre "/home/.../ring-tutorial/src" kein sehr nützlicher Klassenpfad für das Ring-Lernprogramm, da es nur die Quelle des Ring-Lernprogramms enthält und nicht das Clojure-Jar (das zum Ausführen von Clojure-Code erforderlich ist), die Ring-Jars (Ring ist ein Projekt mit mehreren Modulen) oder eines der anderen Gläser, von denen Ring abhängig ist. Der von Leiningen produzierte Klassenpfad mag ziemlich lang erscheinen, aber alle seine Komponenten müssen wirklich da sein.

Übrigens, wenn Sie gerade mit Clojure beginnen, würde ich empfehlen, Sie bleiben bei der Klassenpfad-Management-Funktionen Ihrer Toolchain (das könnte Emacs + lein swank oder eine IDE + das Clojure-Plugin) wenn überhaupt möglich. Ansonsten gibt es viele Fragen zu Clojure Classpath-Problemen hier auf SO, plus eine Vielzahl anderer Ressourcen zu dem Thema, für das man googeln kann ... aber jetzt ist die Tool-Unterstützung ziemlich robust und man braucht normalerweise nicht zu berühren Klassenpfad von Hand, es ist nur Schmerz am besten am Anfang vermieden.

2

Das Problem bei der Verwendung der Variablen CLASSPATH zur Verwaltung Ihrer Abhängigkeiten besteht darin, dass alle Java- und anderen JVM-Sprachen diese für ihre Zwecke bearbeiten müssen. Es dauert nicht lange, bis du dich in der Ecke bemalt hast.

Es funktioniert, wenn Sie einen Server starten, der nur einen Server startet. Es bricht vollständig auf einem PC eines Java-Entwicklers zusammen, der 10 von Programmen und Projekten hat, die alle unterschiedliche Abhängigkeiten benötigen und dann mehr Zeit damit verbringen, Bash-Skripte zu debuggen, um die CLASSPATH-Variable, die Quellcode schreibt, zu manipulieren.

Daher wurde diese Methode zur Verwaltung des Klassenpfades nicht mehr verwendet, da andere Klassenladetechniken bevorzugt wurden oder CLASSPATH nur sehr lokal verwendet wurde.

1

Der Clojure-Klassenpfad ist der Java-Klassenpfad.

$CLASSPATH ignoriert wird, wenn die java ausführbare Datei mit dem -cp Argument aufgerufen wird, die Leiningen (und die meisten anderen Clojure Build-Skripte) zu tun.

Wenn Sie ein Build-Tool wie Leiningen verwenden, müssen Sie es verwenden, um den Klassenpfad zu verwalten.