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代码还得重新编译。
相关文章推荐
- 各种软件的安装(持续)
- 关于Discuz X3.2如何设置邮箱验证的具体方法
- pl/sql知识点总结
- java版 贪吃蛇小游戏 完整源码 (测试100%无误
- Spring Boot MyBatis 连接数据库
- 关于 jquery/touchSwipe.js
- Linux 匿名管道
- FastDFS介绍
- JS之路——浏览器window对象
- oracle初学知识点总结
- Pathon 【iOS程序员如何用Pathon写爬虫】
- POJ 2492 A Bug's Life
- HDU3037
- Java中生成随机字符的方法总结
- java笔记--关于线程同步(5种同步方式)
- Android Studio 编译报错:Manifest merger failed with multiple errors, see logs
- zabbix lld结合pycurl批量监控网站服务质量
- zabbix lld结合pycurl批量监控网站服务质量
- Android异步任务处理框架AsyncTask源码分析
- [设计模式]装饰者模式