Clojure的Maven配置

先說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代碼還得重新編譯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章