先說Clojure
Clojure發音類似”closure”[‘kləʊʒə(r)])],查看了一下官網並沒發現這個名字的由來,也許是閉包的意思。它是JVM中的Lisp,也可以算是現在最實用的Lisp,它可以重用所有的JVM上的庫,在設計上也是很考究,如面向併發設計了STM。而且也有了著名的開源項目Storm。因此,值得慕名而來學習學習,拓展一下思路。
Hello World
去Clojure官網http://www.clojure.org/下載Clojure,最新版本到了1.8。查看了一下可以發現它的目錄如下:
其實能用的只有一個clojure-1.8.0.jar。在此目錄下,打開cmd執行java -cp clojure-1.8.0.jar clojure.main,會得到其REPL界面,就可以進行做實驗了。
不過我們使用這個jar只能做點實驗,作爲一個工程要構建、要管理其他的庫、因此得使用構建工具和包管理工具。在Java裏面的實事標準工具是Maven,在Clojure的官方構建工具則叫leiningen。相比起來leiningen比較簡潔,但是我的感覺Clojure更應該作爲一種Java的補充和Java進行混合編程。因此個人更願意使用Maven作爲構建工具和包管理工具。這種策略也是Storm所採用的。
Maven構建
使用Maven構建實際也比較簡單,因爲Maven其實也有一個jar,所以需要引入一個dependency和一個plugin。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.storm</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.clojure</groupId>
<artifactId>clojure</artifactId>
<version>1.6.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.theoryinpractise</groupId>
<artifactId>clojure-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<sourceDirectories>
<sourceDirectory>src/main/clj</sourceDirectory>
</sourceDirectories>
<testSourceDirectories>
<testSourceDirectory>test/main/clj</testSourceDirectory>
</testSourceDirectories>
<warnOnReflection>false</warnOnReflection>
<copyDeclaredNamespaceOnly>true</copyDeclaredNamespaceOnly>
<copiedNamespaces>
<copiedNamespace>none</copiedNamespace>
</copiedNamespaces>
</configuration>
<executions>
<execution>
<id>compile-clojure</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</build>
</project>
需要clojure-maven-plugin來編譯和運行Clojure,最好把java和clojure分開。該plugin的github如下https://github.com/talios/clojure-maven-plugin。
比較重要的命令如下
- clojure:compile
- clojure:run
- clojure:repl
要和java混合編譯需要設置exceution
<executions>
<execution>
<id>compile-clojure</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
以下設置在eclipse上可能會有錯誤,主要是
<phase>compile</phase>
的compile的階段問題,但使用maven build沒有問題。默認java編譯會在clojure編譯之前,如果要改變這個循序可以改excecution中的phase標籤。
執行clojure:repl就可以進行測試了,如果混合編程,則需要先執行clojure:compile.建立一個測試Java類
public class JavaInClojure {
private final int index;
public JavaInClojure(){
index = 3;
}
public int getIndex(){
return index;
}
}
在建立一個測試clojure模塊
(ns clj.test
(import org.apache.storm.test.JavaInClojure))
(defn hello [str]
(println str ",hello world")
(println (.getIndex (JavaInClojure. )))
)
執行mvn compile clojure:repl得到一個REPL窗口
我們可以看到自己編寫的java類和clojure模塊可以進行混合執行了。
如果改動clojure,可以使用(use clj.test :reload)
就可在REPL中執行,如果改動java代碼還得重新編譯。