2009-12-23 9 views
5

Ich fange an, mit Clojure ein wenig zu spielen und meine Java-Erfahrung ist ziemlich begrenzt. Ich komme aus der dynamischen Welt von Ruby und OO, also ist die funktionale Seite der Dinge sehr interessant!Der einfachste Weg meinen CLASSPATH zu verwalten?

Wie auch immer, während ich Bibliotheken und verschiedene Werkzeuge für die Verwendung (und die Tutorial-Dateien für das Pragmatische Clojure Book) entdecke, erfordert alles normalerweise das Platzieren von Dateien im CLASSPATH, damit Clojure die Bibliothek zur Verwendung sehen kann.

Gibt es so etwas wie eine gute CLASSPATH-Übung? Würde ich jemals nur einen CLASSPATH mit nur den externen Bibliotheken von Dateien haben wollen, die ich brauche, oder kann ich jede Bibliothek oder Datei, die ich jemals brauchen würde, in ein Verzeichnis werfen und sie einfach als CLASSPATH definieren und nur benötigen, was benötigt wird?

Wenn es hilft, bin ich ein OSX und Emacs Benutzer (mit Schleim und Swank-Clojure).

Antwort

2

Persönlich verwende ich eine Variante einer clojure-project elisp Funktion von Phil Hagelberg, siehe Quelle in this post der Clojure Gruppe. Es richtet den Klassenpfad entsprechend für das Projekt ein, an dem Sie arbeiten, und startet dann SLIME. (EDIT: Sie müssen den Wert ändern, die zu swank-clojure-jar-path zugewiesen wird, um clojure.jar zu Punkt Ich verwende (expand-file-name "~/.clojure/clojure.jar") als Standard..)

Um die Frage zu beantworten, über alles, was mit auf dem Classpath die ganze Zeit vs nur werfen, was benötigt wird: nach meinem Wissen, nichts wird tatsächlich brechen, wenn Sie den ersten Ansatz (ich weiß, dass ich das für experimentelle Zwecke), aber scheinbar Dinge brechen mit der ersten Ansatz (siehe cjstehno Kommentar unten) und in einem richtigen Projekt finde ich die zweite sauberer. Irgendwann wird es notwendig sein, zu bestimmen, welche Bibliotheken benutzt werden (und welche Versionen von ihnen), nur um leiningen (oder maven) davon zu erzählen - warum nicht im Auge behalten, während Sie gehen.

+0

Wenn Sie alles auf den Classpath setzen, kann es zu Problemen kommen, insbesondere zu Classloader-Kollisionen oder fehlerhaftem Classloading. In der Regel ist es am besten, nur das zu haben, was Sie auf dem Klassenpfad für Ihre spezifische Anwendung benötigen. – cjstehno

+0

Oh, ich verstehe. Offenbar hatte ich so viel Glück, aber das werde ich mir für die Zukunft merken. Danke für den Kommentar, wird entsprechend editieren. –

+0

Ohhh, ich mag Phils Implementierung eines Clojure-Projekts, ich denke, ich werde es versuchen und etwas zurück melden. Vielen Dank! – mwilliams

1

Wir verwenden Clojure und verwenden eine Reihe von Infrastruktur-Tools, insbesondere Eclipse (IDE) (http://en.wikipedia.org/wiki/Eclipse_%28software%29) und Maven (http://en.wikipedia.org/wiki/Apache_Maven). Maven verwaltet Bibliotheken und JAR-Abhängigkeiten, wenn Sie also eine Anzahl von diesen haben und sie wahrscheinlich beginnen, Maven zu verwenden.

Als Antwort auf Ihre ursprüngliche Frage können Sie einfach Ihre Gläser in einem Verzeichnis und Sie können sie bei jedem Lauf auf Namen zugreifen. Aber Sie werden von den Tools profitieren ...

Wenn Sie nur erkunden, wird Eclipse wahrscheinlich Ihre JAR-Dateien ziemlich schmerzlos verwalten. Sie können diese dem Projekt bei Bedarf über die Option Build Path -> Configure Build Path hinzufügen.

Wenn Sie mit Ihrer Arbeit fortfahren, möchten Sie sie vielleicht in Projekte unterteilen, die Eclipse unterstützt, damit Sie Ihre (oder andere Projekte) zu Ihrem Build Path hinzufügen können.

Wenn Sie externe Clojure-Bibliotheken verwenden, prüfen Sie, ob sie als Maven-Projekte gepackt wurden (sie haben eine pom.xml-Datei). Das POM gibt eine Liste der Abhängigkeiten. #

+0

Eclipse kommt leider nicht in Frage. Wie ich bereits erwähnt habe, verwende ich Emacs für Clojure Dev. – mwilliams

1

Die übliche CLASSPATH-Methode für Java besteht darin, nur die JAR-Dateien, die für ein Projekt benötigt werden, in diesen Projektklassenpfad zu legen, dh potenziell unterschiedliche Klassenpfade für verschiedene Projekte zu haben. Dies wird normalerweise von der IDE als Teil ihrer Projekteigenschaften verwaltet.

Da Sie Emacs verwenden und daher wahrscheinlich keine Projekte verwenden oder verwenden, könnte es für Sie einfacher sein, einen einzigen globalen Klassenpfad für all Ihre clojure-bezogenen Inhalte einzurichten oder zu verwenden oder einfach alles zu setzen die benötigten jar Dateien in das java2se/jre/lib/ext Verzeichnis Ihrer Java Installation.

Die zwei Hauptprobleme, die auftreten können, wenn Sie unnötige JAR-Dateien in Ihrem Klassenpfad haben, sind: 1. Es hat einen geringfügigen negativen Einfluss auf die Startzeit der JVM und 2. es wird schwieriger für Sie haben keine Klassen mit verschiedenen Versionen im selben Klassenpfad (dh verschiedene Klassen mit demselben Paket und demselben Namen in verschiedenen jar-Dateien).

1

Seit Java SE 1.6 (oder JDK 1.6) können Sie Klassenpfadeinträge nach Platzhalterzeichen einschließen. Wenn Ihre Klassendateien leben in \ bin, und Ihre Bibliothek JAR-Dateien leben in \ lib, dann auf Windows Sie Ihre Klasse Pfad so definieren könnte..

set CLASSPATH=bin;lib\*; 

So können Sie JAR-Dateien in der hinzufügen. \ lib Verzeichnis und sie werden automatisch zum Klassenpfad für neue Instanzen der JRE hinzugefügt.

diesen Link für Details: Setting the class path

Vor JDK 1.6 Sie einzeln jede JAR-Datei auf das ClassPath hinzufügen musste.

6

Ich empfehle die Verwendung von Leiningen und Lein-Swank, um dies zu verwalten. Sie können eine REPL im Verzeichnis starten und eine Verbindung von Emacs aus herstellen.

0

Ich entdeckte gerade dieses Stück, das ich einen Schuss geben müssen:

(setq swank-clojure-extra-classpaths (list "/class/path/1" "/class/path/2" "/class/path/3" "etc"))

0

clojure-contrib/Werfern/bash/CLJ-env-dir hat eine interessante Eigenschaft, dass Sie es an einem Punkt kann Verzeichnis und es wird grundsätzlich alles darin enthalten. In der Vergangenheit hatte ich ein ~/Classpath-Verzeichnis, in das ich alle Jars kopieren und alle gängigen Verzeichnisse verbinden würde, und es funktionierte großartig. Sehr einfache Möglichkeit zum Speichern und Verwenden. Jetzt neige ich dazu, Maven clojure-maven-plugin zu verwenden, und das funktioniert auch gut, obwohl es manchmal etwas mühsam sein kann, wenn man nur mit ein paar Ideen herumspielen möchte.

Verwandte Themen