您的位置:首页 > 其它

Clojure的Maven配置

2016-07-24 00:15 525 查看

先说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。

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">project</span> <span class="hljs-attribute">xmlns</span>=<span class="hljs-value">"http://maven.apache.org/POM/4.0.0"</span> <span class="hljs-attribute">xmlns:xsi</span>=<span class="hljs-value">"http://www.w3.org/2001/XMLSchema-instance"</span>
<span class="hljs-attribute">xsi:schemaLocation</span>=<span class="hljs-value">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span> <span class="hljs-tag"><<span class="hljs-title">modelVersion</span>></span>4.0.0<span class="hljs-tag"></<span class="hljs-title">modelVersion</span>></span>

<span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.apache.storm<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>test<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">version</span>></span>0.0.1-SNAPSHOT<span class="hljs-tag"></<span class="hljs-title">version</span>></span>
<span class="hljs-tag"><<span class="hljs-title">packaging</span>></span>jar<span class="hljs-tag"></<span class="hljs-title">packaging</span>></span>

<span class="hljs-tag"><<span class="hljs-title">name</span>></span>test<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url</span>></span>http://maven.apache.org<span class="hljs-tag"></<span class="hljs-title">url</span>></span>

<span class="hljs-tag"><<span class="hljs-title">properties</span>></span>
<span class="hljs-tag"><<span class="hljs-title">project.build.sourceEncoding</span>></span>UTF-8<span class="hljs-tag"></<span class="hljs-title">project.build.sourceEncoding</span>></span>
<span class="hljs-tag"></<span class="hljs-title">properties</span>></span>

<span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-title">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.clojure<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>clojure<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">version</span>></span>1.6.0<span class="hljs-tag"></<span class="hljs-title">version</span>></span>
<span class="hljs-tag"></<span class="hljs-title">dependency</span>></span>
<span class="hljs-tag"></<span class="hljs-title">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-title">build</span>></span>
<span class="hljs-tag"><<span class="hljs-title">plugins</span>></span>
<span class="hljs-tag"><<span class="hljs-title">plugin</span>></span>
<span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>com.theoryinpractise<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>clojure-maven-plugin<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">extensions</span>></span>true<span class="hljs-tag"></<span class="hljs-title">extensions</span>></span>
<span class="hljs-tag"><<span class="hljs-title">configuration</span>></span>
<span class="hljs-tag"><<span class="hljs-title">sourceDirectories</span>></span>
<span class="hljs-tag"><<span class="hljs-title">sourceDirectory</span>></span>src/main/clj<span class="hljs-tag"></<span class="hljs-title">sourceDirectory</span>></span>
<span class="hljs-tag"></<span class="hljs-title">sourceDirectories</span>></span>
<span class="hljs-tag"><<span class="hljs-title">testSourceDirectories</span>></span>
<span class="hljs-tag"><<span class="hljs-title">testSourceDirectory</span>></span>test/main/clj<span class="hljs-tag"></<span class="hljs-title">testSourceDirectory</span>></span>
<span class="hljs-tag"></<span class="hljs-title">testSourceDirectories</span>></span>
<span class="hljs-tag"><<span class="hljs-title">warnOnReflection</span>></span>false<span class="hljs-tag"></<span class="hljs-title">warnOnReflection</span>></span>
<span class="hljs-tag"><<span class="hljs-title">copyDeclaredNamespaceOnly</span>></span>true<span class="hljs-tag"></<span class="hljs-title">copyDeclaredNamespaceOnly</span>></span>
<span class="hljs-tag"><<span class="hljs-title">copiedNamespaces</span>></span>
<span class="hljs-tag"><<span class="hljs-title">copiedNamespace</span>></span>none<span class="hljs-tag"></<span class="hljs-title">copiedNamespace</span>></span>
<span class="hljs-tag"></<span class="hljs-title">copiedNamespaces</span>></span>
<span class="hljs-tag"></<span class="hljs-title">configuration</span>></span>
<span class="hljs-tag"><<span class="hljs-title">executions</span>></span>
<span class="hljs-tag"><<span class="hljs-title">execution</span>></span>
<span class="hljs-tag"><<span class="hljs-title">id</span>></span>compile-clojure<span class="hljs-tag"></<span class="hljs-title">id</span>></span>
<span class="hljs-tag"><<span class="hljs-title">phase</span>></span>compile<span class="hljs-tag"></<span class="hljs-title">phase</span>></span>
<span class="hljs-tag"><<span class="hljs-title">goals</span>></span>
<span class="hljs-tag"><<span class="hljs-title">goal</span>></span>compile<span class="hljs-tag"></<span class="hljs-title">goal</span>></span>
<span class="hljs-tag"></<span class="hljs-title">goals</span>></span>
<span class="hljs-tag"></<span class="hljs-title">execution</span>></span>
<span class="hljs-tag"></<span class="hljs-title">executions</span>></span>
<span class="hljs-tag"></<span class="hljs-title">plugin</span>></span>
<span class="hljs-tag"><<span class="hljs-title">plugin</span>></span>
<span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.apache.maven.plugins<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>maven-compiler-plugin<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-title">version</span>></span>3.5.1<span class="hljs-tag"></<span class="hljs-title">version</span>></span>
<span class="hljs-tag"></<span class="hljs-title">plugin</span>></span>
<span class="hljs-tag"></<span class="hljs-title">plugins</span>></span>
<span class="hljs-tag"></<span class="hljs-title">build</span>></span>
<span class="hljs-tag"></<span class="hljs-title">project</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li></ul>

需要clojure-maven-plugin来编译和运行Clojure,最好把java和clojure分开。该plugin的github如下https://github.com/talios/clojure-maven-plugin

比较重要的命令如下

clojure:compile
clojure:run
clojure:repl
要和java混合编译需要设置exceution

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">executions</span>></span>
<span class="hljs-tag"><<span class="hljs-title">execution</span>></span>
<span class="hljs-tag"><<span class="hljs-title">id</span>></span>compile-clojure<span class="hljs-tag"></<span class="hljs-title">id</span>></span>
<span class="hljs-tag"><<span class="hljs-title">phase</span>></span>compile<span class="hljs-tag"></<span class="hljs-title">phase</span>></span>
<span class="hljs-tag"><<span class="hljs-title">goals</span>></span>
<span class="hljs-tag"><<span class="hljs-title">goal</span>></span>compile<span class="hljs-tag"></<span class="hljs-title">goal</span>></span>
<span class="hljs-tag"></<span class="hljs-title">goals</span>></span>
<span class="hljs-tag"></<span class="hljs-title">execution</span>></span>
<span class="hljs-tag"></<span class="hljs-title">executions</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>

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

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">phase</span>></span>compile<span class="hljs-tag"></<span class="hljs-title">phase</span>></span></code><ul style="" class="pre-numbering"><li>1</li></ul><ul style="" class="pre-numbering"><li>1</li></ul>

的compile的阶段问题,但使用maven build没有问题。默认java编译会在clojure编译之前,如果要改变这个循序可以改excecution中的phase标签。

执行clojure:repl就可以进行测试了,如果混合编程,则需要先执行clojure:compile.建立一个测试Java类

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">JavaInClojure</span> {</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> index;
<span class="hljs-keyword">public</span> <span class="hljs-title">JavaInClojure</span>(){
index = <span class="hljs-number">3</span>;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getIndex</span>(){
<span class="hljs-keyword">return</span> index;
}
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>

在建立一个测试clojure模块

<code class="hljs clojure has-numbering"><span class="hljs-list">(<span class="hljs-title"><span class="hljs-built_in">ns</span></span> clj.test
<span class="hljs-list">(<span class="hljs-title"><span class="hljs-built_in">import</span></span> org.apache.storm.test.JavaInClojure)</span>)</span>

<span class="hljs-list">(<span class="hljs-title"><span class="hljs-built_in">defn</span></span> hello <span class="hljs-collection">[str]</span>
<span class="hljs-list">(<span class="hljs-title">println</span> str <span class="hljs-string">",hello world"</span>)</span>
<span class="hljs-list">(<span class="hljs-title">println</span> <span class="hljs-list">(<span class="hljs-title">.getIndex</span> <span class="hljs-list">(<span class="hljs-title">JavaInClojure.</span> )</span>)</span>)</span>
)</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>

执行mvn compile clojure:repl得到一个REPL窗口



我们可以看到自己编写的java类和clojure模块可以进行混合执行了。

如果改动clojure,可以使用
(use clj.test :reload)
就可在REPL中执行,如果改动java代码还得重新编译。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: