Clojure的Maven配置

先说Clojure

Clojure发音类似”closure”[‘kləʊʒə(r)])],查看了一下官网并没发现这个名字的由来,也许是闭包的意思。它是JVM中的Lisp,也可以算是现在最实用的Lisp,它可以重用所有的JVM上的库,在设计上也是很考究,如面向并发设计了STM。而且也有了著名的开源项目Storm。因此,值得慕名而来学习学习,拓展一下思路。

Hello World

去Clojure官网http://www.clojure.org/下载Clojure,最新版本到了1.8。查看了一下可以发现它的目录如下:
Clojure的Maven配置_第1张图片
其实能用的只有一个clojure-1.8.0.jar。在此目录下,打开cmd执行java -cp clojure-1.8.0.jar clojure.main,会得到其REPL界面,就可以进行做实验了。
Clojure的Maven配置_第2张图片
不过我们使用这个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.0modelVersion>

  <groupId>org.apache.stormgroupId>
  <artifactId>testartifactId>
  <version>0.0.1-SNAPSHOTversion>
  <packaging>jarpackaging>

  <name>testname>
  <url>http://maven.apache.orgurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
  properties>

  <dependencies>
  <dependency>
      <groupId>org.clojuregroupId>
      <artifactId>clojureartifactId>
      <version>1.6.0version>
   dependency>
   dependencies>
  <build>
   <plugins>
    <plugin>
       <groupId>com.theoryinpractisegroupId>
       <artifactId>clojure-maven-pluginartifactId>
       <extensions>trueextensions>
       <configuration>
          <sourceDirectories>
               <sourceDirectory>src/main/cljsourceDirectory>
          sourceDirectories>
          <testSourceDirectories>
                <testSourceDirectory>test/main/cljtestSourceDirectory>
           testSourceDirectories>
           <warnOnReflection>falsewarnOnReflection>
           <copyDeclaredNamespaceOnly>truecopyDeclaredNamespaceOnly>
           <copiedNamespaces>
                 <copiedNamespace>nonecopiedNamespace>
           copiedNamespaces>
       configuration>
       <executions>
           <execution>
               <id>compile-clojureid>
               <phase>compilephase>
               <goals>
                  <goal>compilegoal>
               goals>
           execution>
       executions>
    plugin>
    <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-compiler-pluginartifactId>
        <version>3.5.1version>
    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-clojureid>
               <phase>compilephase>
               <goals>
                  <goal>compilegoal>
               goals>
           execution>
       executions>

以下设置在eclipse上可能会有错误,主要是

<phase>compilephase>

的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窗口
Clojure的Maven配置_第3张图片
我们可以看到自己编写的java类和clojure模块可以进行混合执行了。

如果改动clojure,可以使用(use clj.test :reload)就可在REPL中执行,如果改动java代码还得重新编译。

你可能感兴趣的:(Clojure)