Güncelleme : Bu yanıt gönderildiği için mevcut bazı araçlar değişti. Orijinal cevaptan sonra, mevcut araçlarla örneğin nasıl oluşturulacağına dair bilgiler içeren bir güncelleme var.
Bir kavanoza derlemek ve iç yöntemleri çağırmak kadar basit değil. Her şeyin işe yaraması için birkaç püf noktası var gibi görünüyor. Bir kavanoza derlenebilecek basit bir Clojure dosyası örneği:
(ns com.domain.tiny
(:gen-class
:name com.domain.tiny
:methods [#^{:static true} [binomial [int int] double]]))
(defn binomial
"Calculate the binomial coefficient."
[n k]
(let [a (inc n)]
(loop [b 1
c 1]
(if (> b k)
c
(recur (inc b) (* (/ (- a b) b) c))))))
(defn -binomial
"A Java-callable wrapper around the 'binomial' function."
[n k]
(binomial n k))
(defn -main []
(println (str "(binomial 5 3): " (binomial 5 3)))
(println (str "(binomial 10042 111): " (binomial 10042 111)))
)
Eğer çalıştırırsanız, şöyle bir şey görmelisiniz:
(binomial 5 3): 10
(binomial 10042 111): 49068389575068144946633777...
Ve burada -binomial
işlevi çağıran bir Java programı tiny.jar
.
import com.domain.tiny;
public class Main {
public static void main(String[] args) {
System.out.println("(binomial 5 3): " + tiny.binomial(5, 3));
System.out.println("(binomial 10042, 111): " + tiny.binomial(10042, 111));
}
}
Çıkışı:
(binomial 5 3): 10.0
(binomial 10042, 111): 4.9068389575068143E263
İlk sihir parçası, ifadedeki :methods
anahtar kelimeyi kullanmaktır gen-class
. Clojure işlevine Java'daki statik yöntemler gibi bir şeye erişmenizi sağlamak için gerekli gibi görünüyor.
İkinci şey, Java tarafından çağrılabilen bir sarma işlevi oluşturmaktır. İkinci sürümünün -binomial
önünde bir tire olduğuna dikkat edin .
Ve elbette Clojure kavanozunun kendisi sınıf yolunda olmalıdır. Bu örnekte Clojure-1.1.0 kavanozu kullanılmıştır.
Güncelleme : Bu yanıt aşağıdaki araçlar kullanılarak yeniden test edilmiştir:
- Clojure 1.5.1
- Leiningen 2.1.3
- JDK 1.7.0 Güncelleme 25
Clojure Bölümü
İlk olarak Leiningen'i kullanarak bir proje ve ilişkili dizin yapısı oluşturun:
C:\projects>lein new com.domain.tiny
Şimdi proje dizinine geçin.
C:\projects>cd com.domain.tiny
Proje dizininde project.clj
dosyayı açın ve içeriği aşağıda gösterildiği şekilde düzenleyin.
(defproject com.domain.tiny "0.1.0-SNAPSHOT"
:description "An example of stand alone Clojure-Java interop"
:url "http://clarkonium.net/2013/06/java-clojure-interop-an-update/"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.5.1"]]
:aot :all
:main com.domain.tiny)
Şimdi, tüm bağımlılıkların (Clojure) kullanılabilir olduğundan emin olun.
C:\projects\com.domain.tiny>lein deps
Bu noktada Clojure kavanozunu indirmeyle ilgili bir mesaj görebilirsiniz.
Şimdi Clojure dosyasını C:\projects\com.domain.tiny\src\com\domain\tiny.clj
orijinal yanıtta gösterilen Clojure programını içerecek şekilde düzenleyin . (Bu dosya Leiningen projeyi yarattığında oluşturulmuştur.)
Buradaki sihrin çoğu isim-alanı beyanındadır. :gen-class
Adında bir sınıf oluşturmasını söyler com.domain.tiny
denilen tek bir statik yöntemi ile binomial
, bir işlevi, iki tamsayı argüman alarak ve bir çift dönen. Benzer şekilde adlandırılmış iki işlev vardır: binomial
geleneksel Clojure işlevi ve -binomial
Java'dan erişilebilen sarıcı. İşlev adındaki tireye dikkat edin -binomial
. Varsayılan önek kısa çizgidir, ancak istenirse başka bir şeyle değiştirilebilir. -main
Fonksiyon sadece binom işlevine çağrı birkaç biz doğru sonuçlar elde edildiğinden emin olmak için yapar. Bunu yapmak için sınıfı derleyin ve programı çalıştırın.
C:\projects\com.domain.tiny>lein run
Orijinal yanıtta gösterilen çıktıyı görmelisiniz.
Şimdi bir kavanozda paketleyin ve uygun bir yere koyun. Clojure kavanozunu oraya da kopyalayın.
C:\projects\com.domain.tiny>lein jar
Created C:\projects\com.domain.tiny\target\com.domain.tiny-0.1.0-SNAPSHOT.jar
C:\projects\com.domain.tiny>mkdir \target\lib
C:\projects\com.domain.tiny>copy target\com.domain.tiny-0.1.0-SNAPSHOT.jar target\lib\
1 file(s) copied.
C:\projects\com.domain.tiny>copy "C:<path to clojure jar>\clojure-1.5.1.jar" target\lib\
1 file(s) copied.
Java Bölümü
Leiningen, lein-javac
Java derlemesine yardımcı olması gereken yerleşik bir göreve sahiptir . Ne yazık ki, 2.1.3 sürümünde bozuk görünüyor. Kurulu JDK'yı bulamaz ve Maven deposunu bulamaz. Her ikisinin de yolları sistemime katıştırılmış boşluklara sahip. Sorunun bu olduğunu düşünüyorum. Herhangi bir Java IDE derleme ve paketlemeyi de halledebilir. Ama bu yazı için eski okula gidiyoruz ve bunu komut satırında yapıyoruz.
Önce dosyayı Main.java
orijinal yanıtta gösterilen içerikle oluşturun .
Java bölümünü derlemek için
javac -g -cp target\com.domain.tiny-0.1.0-SNAPSHOT.jar -d target\src\com\domain\Main.java
Şimdi oluşturmak istediğimiz kavanoza eklemek için bazı meta bilgileri içeren bir dosya oluşturun. Alanına Manifest.txt
aşağıdaki metni ekleyin
Class-Path: lib\com.domain.tiny-0.1.0-SNAPSHOT.jar lib\clojure-1.5.1.jar
Main-Class: Main
Şimdi hepsini Clojure programımız ve Clojure kavanoz dahil olmak üzere büyük bir kavanoz dosyasına paketleyin.
C:\projects\com.domain.tiny\target>jar cfm Interop.jar Manifest.txt Main.class lib\com.domain.tiny-0.1.0-SNAPSHOT.jar lib\clojure-1.5.1.jar
Programı çalıştırmak için:
C:\projects\com.domain.tiny\target>java -jar Interop.jar
(binomial 5 3): 10.0
(binomial 10042, 111): 4.9068389575068143E263
Çıktı, temel olarak yalnızca Clojure tarafından üretilenle aynıdır, ancak sonuç bir Java çiftine dönüştürülmüştür.
Belirtildiği gibi, bir Java IDE muhtemelen dağınık derleme argümanları ve ambalajı ile ilgilenecektir.