2010-07-24 4 views
7

Ich experimentiere mit und versuche, ein Gefühl für die Verwendung von 3rd-Party-Bibliotheken zu bekommen. Ich konnte eine Quelle herunterladen, sie mit leiningen in eine JAR-Datei bündeln, in meinen Klassenpfad einfügen und (lib.etc verwenden) in mein Skript einfügen. Ich habe auch mit den Objekten in java.lang. * Gespielt.Verwenden von 3rd-Party-Java-Bibliotheken, wie com.jcraft.jsch, mit clojure

Ich hatte jedoch keinen Erfolg mit 3rd-Party-Java.

$ java -cp clojure.jar:clojure-contrib.jar:com.jcraft.jsch_0.1.31.jar clojure.main 
Clojure 1.1.0 
user=> (require 'com.jcraft.jsch) 
java.io.FileNotFoundException: Could not locate com/jcraft/jsch__init.class or com/jcraft/jsch.clj on classpath: (NO_SOURCE_FILE:0) 

$ jar tf com.jcraft.jsch_0.1.31.jar | egrep "(init|clj)" 
$ 

Es sieht aus wie eine __init.class oder .clj Datei erstellt werden muss. Stimmt das, oder gibt es eine alternative Möglichkeit, reine Java-Klassen zu laden?

Antwort

8

für Java-Klassen verwenden import:

(import java.util.ArrayList) 

;// or use a prefix for multiple classes: 
(import [java.util ArrayList Collection]) 

;// or preferably in the ns declaration: 
(ns my.lib 
    [:import [java.util ArrayList Collection]]) 

user=> (def al (ArrayList.)) 
#'user/al 
user=> (.add al "hi") 
true 
user=> (.size al) 
1 

Beachten Sie die Paket- und Klassennamen müssen nicht angegeben werden, da import ein Makro.

Auch gibt es keine Entsprechung zu import java.util.*; Sie müssen angeben, welche Klassen Sie importieren möchten.

1

Versuchen Sie, import für non-clojure Sachen zu verwenden.