Clojure的Maven配置

来源:互联网 发布:开淘宝网店程序 编辑:程序博客网 时间:2024/05/19 03:21

先说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代码还得重新编译。

0 0