<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/BlogJavaDotNet" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/BlogJavaDotNet" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 14 Feb 2012 13:31:00 GMT</lastBuildDate><title>BlogJava-首页技术区</title><description>专注于Java技术</description><link>http://www.blogjava.net/</link><language>zh-cn</language><pubDate>Tue, 14 Feb 2012 13:46:46 GMT</pubDate><item><title>Java中计算两个日期相差几天</title><link>http://www.blogjava.net/cx361/archive/2012/02/14/369984.html</link><wfw:comment>http://www.blogjava.net/cx361/comments/369984.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cx361/comments/commentRss/369984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cx361/services/trackbacks/369984.html</trackback:ping><description>&lt;p&gt;public class Test {&lt;br /&gt;public void dateDiff(String startTime, String endTime, String format) {&lt;br /&gt;//按照传入的格式生成一个simpledateformate对象&lt;br /&gt;SimpleDateFormat sd = new SimpleDateFormat(format);&lt;br /&gt;long nd = 1000*24*60*60;//一天的毫秒数&lt;br /&gt;long nh = 1000*60*60;//一小时的毫秒数&lt;br /&gt;long nm = 1000*60;//一分钟的毫秒数&lt;br /&gt;long ns = 1000;//一秒钟的毫秒数&lt;br /&gt;long diff;&lt;br /&gt;try {&lt;br /&gt;//获得两个时间的毫秒时间差异&lt;br /&gt;diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();&lt;br /&gt;long day = diff/nd;//计算差多少天&lt;br /&gt;long hour = diff%nd/nh;//计算差多少小时&lt;br /&gt;long min = diff%nd%nh/nm;//计算差多少分钟&lt;br /&gt;long sec = diff%nd%nh%nm/ns;//计算差多少秒&lt;br /&gt;//输出结果&lt;br /&gt;System.out.println(&quot;时间相差：&quot;+day+&quot;天&quot;+hour+&quot;小时&quot;+min+&quot;分钟&quot;+sec+&quot;秒。&quot;);&lt;br /&gt;} catch (ParseException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;public static void main(String[] args) {&lt;br /&gt;new Test().dateDiff(new SimpleDateFormat(&quot;yyyy-MM-dd&quot;).format(new Date()), &quot;2011-4-28&quot;, &quot;yyyy-MM-dd&quot;);&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&lt;img src =&quot;http://www.blogjava.net/cx361/aggbug/369984.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/cx361/&quot; target=&quot;_blank&quot;&gt;脉凌网络&lt;/a&gt; 2012-02-14 21:31 &lt;a href=&quot;http://www.blogjava.net/cx361/archive/2012/02/14/369984.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605673770/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/cx361/archive/2012/02/14/369984.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Tue, 14 Feb 2012 21:31:00 +0800</pubDate><author>脉凌网络</author><comments>http://www.blogjava.net/cx361/archive/2012/02/14/369984.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/cx361/archive/2012/02/14/369984.html</guid><dc:creator>脉凌网络</dc:creator><fs:srclink>http://www.blogjava.net/cx361/archive/2012/02/14/369984.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605673770/1503656</fs:itemid></item><item><title>Clojure世界：使用rlwrap增强REPL</title><link>http://www.blogjava.net/killme2008/archive/2012/02/14/369976.html</link><wfw:comment>http://www.blogjava.net/killme2008/comments/369976.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/369976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/369976.html</trackback:ping><description>&amp;nbsp;&amp;nbsp;&amp;nbsp; Clojure的REPL非常方便，可以随时随地试验你的想法，REPL是read-eval-print-loop的简称。默认clojure.contrib有带一个shell脚本来启动REPL，具体看&lt;a href=&quot;https://github.com/richhickey/clojure-contrib/blob/master/launchers/bash/clj-env-dir&quot;&gt;这里&lt;/a&gt;。你也可以用JLine来增强REPL：&lt;br /&gt;
&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;java&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;cp&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;%CLOJURE_DIR%\jline-VERSION.jar;%CLOJURE_JAR%&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;jline.ConsoleRunner&amp;nbsp;clojure.main&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 不过，其实你还可以用&lt;a href=&quot;http://utopia.knoware.nl/~hlub/rlwrap/#rlwrap&quot;&gt;rlwrap&lt;/a&gt;这个GNU库来增强clojure REPL。使用它有如下好处：&lt;br /&gt;
1.Tab completion，使用tab做代码提示。&lt;br /&gt;
2.括号匹配&lt;br /&gt;
3.历史记录，哪怕你重启REPL&lt;br /&gt;
4.通过&lt;a href=&quot;http://tiswww.case.edu/php/chet/readline/readline.html#SEC9&quot;&gt;.inputrc&lt;/a&gt;来绑定vi或者emacs&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 具体操作步骤如下：&lt;br /&gt;
&lt;br /&gt;
1.首先，你需要在你的机器上安装rlwrap，你可以通过apt或者port,homebrew等工具安装或者自己下载安装：&lt;br /&gt;
&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;sudo&amp;nbsp;port&amp;nbsp;install&amp;nbsp;rlwrap&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
2.在你的home目录下创建一个clojure目录作为clojure home，并拷贝clojure.jar进去：&lt;br /&gt;
&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;mkdir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;~/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure&lt;br /&gt;
cp&amp;nbsp;.m2&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;repository&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;org&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1.3&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1.3&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;.jar&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;~/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure.jar &lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
我是从maven的本地仓库里拷贝了clojure 1.3的jar包过去，重命名为clojure.jar&lt;br /&gt;
&lt;br /&gt;
3.创建一个shell脚本名为clj，并放入你的path变量，脚本内容：&lt;br /&gt;
&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;!/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;bin&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;sh&lt;br /&gt;
breakchars&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(){}[],^%$#@\&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;\&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;;:''|\\&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;
CLOJURE_DIR&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;=~/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure&lt;br /&gt;
CLOJURE_JAR&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$CLOJURE_DIR&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;clojure.jar&lt;br /&gt;
JAVA_OPTS&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-Xmx512m&amp;nbsp;-XX:MaxPermSize=256m&amp;nbsp;-XX:+UseConcMarkSweepGC&amp;nbsp;-XX:+UseCMSCompactAtFullCollection&amp;nbsp;-XX:+CMSClassUnloadingEnabled&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;[&amp;nbsp;$#&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;eq&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;];&amp;nbsp;then&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exec&amp;nbsp;rlwrap&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;remember&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;c&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;b&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$breakchars&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;\&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;f&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;.clj_completions&amp;nbsp;\&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;t&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;Clojure&amp;nbsp;REPL&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;\&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;p&amp;nbsp;red&amp;nbsp;\&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;H&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$CLOJURE_DIR&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;.repl_history&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;s&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;\&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;java&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$JAVA_OPTS&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;cp&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$CLOJURE_JAR&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;clojure.main&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exec&amp;nbsp;java&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;cp&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$CLOJURE_JAR&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;clojure.main&amp;nbsp;$&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;$@&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;
fi&lt;/span&gt;&lt;/div&gt;
我们将命令历史输出到~/clojure/.repl_history文件中，并限制数目为1000。&lt;br /&gt;
&lt;br /&gt;
4.clj脚本中通过-f选项指定了completions文件为~/.clj_completions，执行下列clojure程序生成此文件：&lt;br /&gt;
&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(def&amp;nbsp;completions&amp;nbsp;(keys&amp;nbsp;(ns&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;publics&amp;nbsp;(find&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;ns&amp;nbsp;'clojure.core))))&lt;br /&gt;
;(def&amp;nbsp;completions&amp;nbsp;(mapcat&amp;nbsp;(comp&amp;nbsp;keys&amp;nbsp;ns&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;publics)&amp;nbsp;(all&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;ns)))&lt;br /&gt;
(&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;with&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;open&amp;nbsp;[f&amp;nbsp;(java.io.BufferedWriter.&amp;nbsp;(java.io.FileWriter.&amp;nbsp;(str&amp;nbsp;(System&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;getenv&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;HOME&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/.clj_completions&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(.write&amp;nbsp;f&amp;nbsp;(apply&amp;nbsp;str&amp;nbsp;(interpose&amp;nbsp;\newline&amp;nbsp;completions))))&lt;/span&gt;&lt;/div&gt;
这个程序只生成clojure.core的completions文件，如果你想将所有ns都加入进去，注释掉第一行，使用第二行程序。&lt;br /&gt;
&lt;br /&gt;
5.最后，配置下~/.inputrc文件：&lt;br /&gt;
&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;
&lt;br /&gt;
Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;
http://www.CodeHighlighter.com/&lt;br /&gt;
&lt;br /&gt;
--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;set&amp;nbsp;editing&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;mode&amp;nbsp;emacs&lt;br /&gt;
tab:&amp;nbsp;complete&lt;br /&gt;
set&amp;nbsp;completion&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;items&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;
set&amp;nbsp;completion&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;ignore&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;on&lt;br /&gt;
set&amp;nbsp;blink&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;matching&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;paren&amp;nbsp;on&lt;br /&gt;
set&amp;nbsp;bell&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;style&amp;nbsp;visible&lt;/span&gt;&lt;/div&gt;
我绑定为emacs，你可以选择vi。&lt;br /&gt;
&lt;br /&gt;
6.一切搞定，接下来你可以敲入命令clj来使用rlwrap启动clojure REPL了，可以用tab做代码提示了，可以用Ctrl + r来搜索历史命令，运行截图：&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;http://www.blogjava.net/images/blogjava_net/killme2008/rlwrap.png&quot; height=&quot;101&quot; width=&quot;900&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
参考：&lt;a href=&quot;http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Enhancing_Clojure_REPL_with_rlwrap&quot;&gt;http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started#Enhancing_Clojure_REPL_with_rlwrap&lt;/a&gt;&lt;img src =&quot;http://www.blogjava.net/killme2008/aggbug/369976.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/killme2008/&quot; target=&quot;_blank&quot;&gt;dennis&lt;/a&gt; 2012-02-14 19:05 &lt;a href=&quot;http://www.blogjava.net/killme2008/archive/2012/02/14/369976.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605673778/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/killme2008/archive/2012/02/14/369976.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Tue, 14 Feb 2012 19:05:00 +0800</pubDate><author>dennis</author><comments>http://www.blogjava.net/killme2008/archive/2012/02/14/369976.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/killme2008/archive/2012/02/14/369976.html</guid><dc:creator>dennis</dc:creator><fs:srclink>http://www.blogjava.net/killme2008/archive/2012/02/14/369976.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605673778/1503656</fs:itemid></item><item><title>解决jenkins执行sonar时重复执行两次test的问题</title><link>http://www.blogjava.net/aoxj/archive/2012/02/14/369936.html</link><wfw:comment>http://www.blogjava.net/aoxj/comments/369936.html</wfw:comment><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/aoxj/comments/commentRss/369936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aoxj/services/trackbacks/369936.html</trackback:ping><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 摘要: 在jenkins上建立了一个job，通过标准的maven命令来执行打包测试和上传artifact到nexus仓库。随后发现有些性能问题：sonar的job执行时，需要重新update SCM，然后需要再次执行test，之后才能进行真正属于sonar的任务如代码检测等。明显update SCM 和执行test是重复了原有job，纯属浪费。这个重复执行问题随着测试案例和测试执行时间的增加，会越来越明显。因此需要考虑消除这里的重复问题，减少build的时间，并节约jenkins的资源。&amp;nbsp;&amp;nbsp;&lt;a href='http://www.blogjava.net/aoxj/archive/2012/02/14/369936.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://www.blogjava.net/aoxj/aggbug/369936.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/aoxj/&quot; target=&quot;_blank&quot;&gt;sky ao&lt;/a&gt; 2012-02-14 14:53 &lt;a href=&quot;http://www.blogjava.net/aoxj/archive/2012/02/14/369936.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605581115/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/aoxj/archive/2012/02/14/369936.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Tue, 14 Feb 2012 14:53:00 +0800</pubDate><author>sky ao</author><comments>http://www.blogjava.net/aoxj/archive/2012/02/14/369936.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/aoxj/archive/2012/02/14/369936.html</guid><dc:creator>sky ao</dc:creator><fs:srclink>http://www.blogjava.net/aoxj/archive/2012/02/14/369936.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605581115/1503656</fs:itemid></item><item><title>理解Java对象序列化(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html</link><wfw:comment>http://www.blogjava.net/jiangshachina/comments/369898.html</wfw:comment><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/369898.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/369898.html</trackback:ping><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 摘要: 理解Java对象序列化关于Java序列化的文章早已是汗牛充栋了，本文是对我个人过往学习，理解及应用Java序列化的一个总结。此文内容涉及Java序列化的基本原理，以及多种方法对序列化形式进行定制。在撰写本文时，既参考了Thinking in Java, Effective Java，JavaWorld，developerWorks中的相关文章和其它网络资料，也加入了自己的实践经验与理解，文、码并茂...&amp;nbsp;&amp;nbsp;&lt;a href='http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://www.blogjava.net/jiangshachina/aggbug/369898.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/jiangshachina/&quot; target=&quot;_blank&quot;&gt;Sha Jiang&lt;/a&gt; 2012-02-13 23:22 &lt;a href=&quot;http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605385727/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Mon, 13 Feb 2012 23:22:00 +0800</pubDate><author>Sha Jiang</author><comments>http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html</guid><dc:creator>Sha Jiang</dc:creator><fs:srclink>http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605385727/1503656</fs:itemid></item><item><title>Java EE 7 新功能前瞻</title><link>http://www.blogjava.net/shinzey/archive/2012/02/13/369874.html</link><wfw:comment>http://www.blogjava.net/shinzey/comments/369874.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shinzey/comments/commentRss/369874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shinzey/services/trackbacks/369874.html</trackback:ping><description>&lt;div class=&quot;article&quot;&gt;
    &lt;p&gt;21 世纪初，Spring 框架的诞生和崛起让沉重而腐朽的 J2EE 遭到了当头棒喝，随后大批开发人员转投 Spring 阵营，呼吸间就让 J2EE 阵营大伤元气。然而这种命悬一线的危机并没有造成毁灭性的打击，尤其是对于 Java 这种提倡开放的平台而言，取长补短，互相促进才是正道。于是，JCP 委员会痛定思痛，在 2006 年推出 Java EE 5 规范，主要是对 EJB 的开发进行了极大幅度的简化。2008 年发布的 Java EE 6 引入了 CDI、BV、JAX-RS 等一系列新功能，并且以配置文件（profile）的方式让 Java EE 向轻量级迈进了一步。特别有趣的是，Spring 框架也开始提供对某些 Java EE 注解的支持，是否标志着两大阵营开始合流？Java EE 7 预定于今年下半年发布，目标是支持云计算。最近几年来，云计算一直被炒作，却从来没有一个准确的定义和规范，希望 Java EE 7 能够在 Java 界扭转这种尴尬的局面。&lt;/p&gt;
    &lt;p&gt;下面开始详细列举 Java EE 7 的新功能前瞻，数据来源于《Java Magazine 2012-01/02》中的《Cloud/Java EE: Looking Ahead to Java EE 7》一文。Java EE 7 是以“日期驱动”的方式开发的，也就是说，在计划日期到达前没有完成的功能都将被推迟到 Java EE 8。&lt;/p&gt;
    &lt;h1&gt;Java EE 7（JSR-342）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;主题：让应用程序能够在私有或公共云上容易地运行。&lt;/li&gt;
        &lt;li&gt;该平台将定义一个应用程序元数据描述符，以描述 PaaS 执行环境（例如多租户、资源共享、服务质量，以及应用程序间的依赖）。&lt;/li&gt;
        &lt;li&gt;支持 HTML5、WebSocket、JSON 等新标准，并为它们一一提供 API。&lt;/li&gt;
        &lt;li&gt;消除受管 Bean、EJB、Servlet、JSF、CDI 和 JAX-RS 之间不一致的地方。&lt;/li&gt;
        &lt;li&gt;可能在 Web 配置文件中包含 JAX-RS 2.0 和 JMS 2.0 API 修订版。&lt;/li&gt;
        &lt;li&gt;更新一些现有的技术，可能引入用于 Java EE 的并发工具（JSR-236）和 JCache（JSR-107）。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Java Persistence 2.1（JSR-338）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;支持多租户。&lt;/li&gt;
        &lt;li&gt;支持存储过程和厂商函数。&lt;/li&gt;
        &lt;li&gt;用规则（Criteria）进行更新和删除。&lt;/li&gt;
        &lt;li&gt;支持数据库大纲（Scheme）的生成。&lt;/li&gt;
        &lt;li&gt;持久化上下文的同步。&lt;/li&gt;
        &lt;li&gt;侦听器中的 CDI 注入。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;JAX-RS 2.0: The Java API for RESTful Web Services（JSR-339）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;客户端 API——底层使用构建者模式，可能提供上层封装。&lt;/li&gt;
        &lt;li&gt;超媒体——轻松创建和处理关联了资源的链接。&lt;/li&gt;
        &lt;li&gt;使用 Bean 验证框架来验证表单或查询参数。&lt;/li&gt;
        &lt;li&gt;与 &lt;code&gt;@Inject&lt;/code&gt; 更紧密集成。&lt;/li&gt;
        &lt;li&gt;服务端的异步请求处理。&lt;/li&gt;
        &lt;li&gt;使用“qs”进行服务端的内容协商。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Java Servlet 3.1（JSR-340）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;为 Web 应用程序优化 PaaS 模型。&lt;/li&gt;
        &lt;li&gt;用于安全、会话和资源的多租户。&lt;/li&gt;
        &lt;li&gt;基于 NIO2 的异步 I/O。&lt;/li&gt;
        &lt;li&gt;简化的异步 Servlet。&lt;/li&gt;
        &lt;li&gt;利用 Java EE 并发工具。&lt;/li&gt;
        &lt;li&gt;支持 WebSocket。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Expression Language 3.0（JSR-341）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;将 &lt;code&gt;ELContext&lt;/code&gt; 分离为解析和求值上下文。&lt;/li&gt;
        &lt;li&gt;可定制的 EL 强迫规则。&lt;/li&gt;
        &lt;li&gt;在 EL 表达式中直接引用静态方法和成员。&lt;/li&gt;
        &lt;li&gt;添加运算符，例如等于、字符串连接和取大小。&lt;/li&gt;
        &lt;li&gt;与 CDI 集成，例如在表达式求值前/中/后生成事件。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Java Message Service 2.0（JSR-343）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;简化开发——改变 JMS 编程模型，让应用程序开发变得更加简单容易。&lt;/li&gt;
        &lt;li&gt;清除/澄清现有规范中的模糊之处。&lt;/li&gt;
        &lt;li&gt;与 CDI 集成。&lt;/li&gt;
        &lt;li&gt;澄清 JMS 和其他 Java EE 规范之间的关系。&lt;/li&gt;
        &lt;li&gt;新的强制性 API允许任何 JMS 提供者能与任何 Java EE 容器集成。&lt;/li&gt;
        &lt;li&gt;来自平台的多租户和其他云相关的功能。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;JavaServer Faces 2.2（JSR-344）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;简化开发——使配置选项动态化，使复合组件中的 &lt;code&gt;cc:interface&lt;/code&gt; 可选，Facelet 标记库的速记 URL，与 CDI 集成，JSF 组件的 OSGi 支持。&lt;/li&gt;
        &lt;li&gt;支持 Portlet 2.0 桥（JSR-329）的实现。&lt;/li&gt;
        &lt;li&gt;支持 HTML5 的功能，例如 HTML5 表单、元数据、头部和区段内容模型。&lt;/li&gt;
        &lt;li&gt;流管理，页面导航事件的侦听器，以及 &lt;code&gt;fileUpload&lt;/code&gt; 和 &lt;code&gt;BackButton&lt;/code&gt; 等新组件。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Enterprise JavaBeans 3.2（JSR-345）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;增强 EJB 架构以支持 PaaS，例如多租户。&lt;/li&gt;
        &lt;li&gt;对在 EJB 外使用容器管理的事务进行工厂化。&lt;/li&gt;
        &lt;li&gt;更进一步使用注解。&lt;/li&gt;
        &lt;li&gt;与平台中的其他规范对齐和集成。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Contexts and Dependency Injection 1.1（JSR-346）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;拦截器的全局排序和管理内建上下文的装饰器 API。&lt;/li&gt;
        &lt;li&gt;可在 Java EE 容器外启动的嵌入式模式。&lt;/li&gt;
        &lt;li&gt;声明式地控制归档中的哪些包和 Bean 将被扫描。&lt;/li&gt;
        &lt;li&gt;注入日志之类的静态成员。&lt;/li&gt;
        &lt;li&gt;将 Servlet 事件作为 CDI 事件发送。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Bean Validation 1.1（JSR-349）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;与其他 Java EE 规范集成。&lt;/li&gt;
        &lt;li&gt;JAX-RS：在 HTTP 调用中验证参数和返回值。&lt;/li&gt;
        &lt;li&gt;JAXB：将约束条件转换到 XML 模式描述符中。&lt;/li&gt;
        &lt;li&gt;方法级别的验证。&lt;/li&gt;
        &lt;li&gt;在组集合上应用约束条件。&lt;/li&gt;
        &lt;li&gt;扩展模型以支持“与”和“或”风格的组合。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;JCache: Java Temporary Caching API（JSR-107）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;在内存中暂存 Java 对象的 API 和语义，包括对象的创建、共享访问、缓存池、失效，以及跨 JVM 的一致性。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Java State Management（JSR-350）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;应用程序和 Java EE 容器可使用该 API 将状态管理的任务交给具有不同 QoS 特征的第三方提供者。&lt;/li&gt;
        &lt;li&gt;基于 Java SE 的调用者可通过查询状态提供者来访问状态数据。&lt;/li&gt;
        &lt;li&gt;可添加具有不同 QoS 的提供者，API 调用者能够按自己的规则进行查询。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Batch Applications for the Java Platform（JSR-352）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;用于批处理应用程序的编程模型，以及用于调度和执行工作的运行时。&lt;/li&gt;
        &lt;li&gt;为标准编程模型定义批处理工作、批处理工作步骤、批处理应用程序、批处理执行器和批处理工作管理器。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Concurrency Utilities for Java EE（JSR-236）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;提供一个整洁、简单且独立的 API，使其能用于任何 Java EE 容器中。&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h1&gt;Java API for JSON Processing（JSR-353）&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;处理 JSON 的 Java API。&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;&lt;img src =&quot;http://www.blogjava.net/shinzey/aggbug/369874.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/shinzey/&quot; target=&quot;_blank&quot;&gt;蜀山兆孨龘&lt;/a&gt; 2012-02-13 22:23 &lt;a href=&quot;http://www.blogjava.net/shinzey/archive/2012/02/13/369874.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605535115/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/shinzey/archive/2012/02/13/369874.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Mon, 13 Feb 2012 22:23:00 +0800</pubDate><author>蜀山兆孨龘</author><comments>http://www.blogjava.net/shinzey/archive/2012/02/13/369874.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/shinzey/archive/2012/02/13/369874.html</guid><dc:creator>蜀山兆孨龘</dc:creator><fs:srclink>http://www.blogjava.net/shinzey/archive/2012/02/13/369874.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605535115/1503656</fs:itemid></item><item><title>Clojure世界：Http Client</title><link>http://www.blogjava.net/killme2008/archive/2012/02/13/369890.html</link><wfw:comment>http://www.blogjava.net/killme2008/comments/369890.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/369890.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/369890.html</trackback:ping><description>&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用http client提交表单或者下载网页也是非常常见的任务，比如使用Java的时候可以用标准库的HttpURLConnection，也可以选择&lt;a href=&quot;http://hc.apache.org/&quot;&gt;Apache Http Client&lt;/a&gt;。在clojure里也有这样的类库，这里我将介绍三个各有特色的http client实现。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先，我最先推荐使用clj-http这个类库，它是Apache HttpClient的clojure wrapper，是一个提供同步API的简单易用的Http Client。&lt;br /&gt;&lt;br /&gt;名称: clj-http&lt;br /&gt;主页：&lt;a href=&quot;https://github.com/dakrone/clj-http&quot;&gt;https://github.com/dakrone/clj-http&lt;/a&gt;&lt;br /&gt;依赖：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;[clj&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;0.3.1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;例子：&lt;br /&gt;&lt;div style=&quot;background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(require&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;[clj-http.client&amp;nbsp;:as&amp;nbsp;client])&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://google.com&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;结果：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt; ｛:cookies {&quot;NID&quot; {:domain &quot;.google.com.hk&quot;, :expires #&amp;lt;Date Tue Aug 14 18:20:38 CST 2012&amp;gt;, :path &quot;/&quot;, :value &quot;56=qn2OWtODE2D3fUKi_vbi44jZepOeLI9xC4Ta1JQLEicqUvIZAqr7TCmft_hq8i_FRwnFXdTK1jV2S5IrSZFyYhlAN2KcQEXgWX1iK36gM2iYPaKPihuUZDCqgiAamDOl&quot;, :version 0}, &quot;PREF&quot; {:domain &quot;.google.com.hk&quot;, :expires #&amp;lt;Date Wed Feb 12 18:20:38 CST 2014&amp;gt;, :path &quot;/&quot;, :value &quot;ID=8b73a654ff0a2783:FF=0:NW=1:TM=1329128438:LM=1329128438:S=uEM4SsFuHlkqtVhp&quot;, :version 0}},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :status&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:headers&amp;nbsp;{&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;date&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;Sun,&amp;nbsp;01&amp;nbsp;Aug&amp;nbsp;2010&amp;nbsp;07:03:49&amp;nbsp;GMT&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;cache-control&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;private,&amp;nbsp;max-age=0&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;content-type&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;text/html;&amp;nbsp;charset=ISO-8859-1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;img src=&quot;http://www.blogjava.net/Images/dot.gif&quot;  alt=&quot;&quot; /&gt;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:body&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;lt;!doctype&amp;nbsp;html&amp;gt;&lt;img src=&quot;http://www.blogjava.net/Images/dot.gif&quot;  alt=&quot;&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:trace&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;redirects&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://google.com&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://www.google.com/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://www.google.fr/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]}&lt;/span&gt;&lt;/div&gt;更多例子：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.com/resources/3&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:accept&amp;nbsp;:json})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Various&amp;nbsp;options:&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;post&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.com/api&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;{:basic&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;auth&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;pass&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:body&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;{\&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;json\&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;:&amp;nbsp;\&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;input\&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:headers&amp;nbsp;{&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;X-Api-Version&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:content&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;type&amp;nbsp;:json&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:socket&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;timeout&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:conn&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;timeout&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;:accept&amp;nbsp;:json})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Need&amp;nbsp;to&amp;nbsp;contact&amp;nbsp;a&amp;nbsp;server&amp;nbsp;with&amp;nbsp;an&amp;nbsp;untrusted&amp;nbsp;SSL&amp;nbsp;cert&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;https://alioth.debian.org&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:insecure&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;If&amp;nbsp;you&amp;nbsp;don&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;t&amp;nbsp;want&amp;nbsp;to&amp;nbsp;follow-redirects&amp;nbsp;automatically:&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.come/redirects-somewhere&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:follow&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;redirects&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Only&amp;nbsp;follow&amp;nbsp;a&amp;nbsp;certain&amp;nbsp;number&amp;nbsp;of&amp;nbsp;redirects:&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.come/redirects-somewhere&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:max&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;redirects&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Throw&amp;nbsp;an&amp;nbsp;exception&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;redirected&amp;nbsp;too&amp;nbsp;many&amp;nbsp;times:&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.come/redirects-somewhere&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:max&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;redirects&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;:&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;throw&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;exceptions&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Send&amp;nbsp;form&amp;nbsp;params&amp;nbsp;as&amp;nbsp;a&amp;nbsp;urlencoded&amp;nbsp;body&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;post&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http//site.com&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:form&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;params&amp;nbsp;{:foo&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;bar&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;}})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Multipart&amp;nbsp;form&amp;nbsp;uploads&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;posts&lt;br /&gt;;;&amp;nbsp;a&amp;nbsp;map&amp;nbsp;or&amp;nbsp;vector&amp;nbsp;works&amp;nbsp;as&amp;nbsp;the&amp;nbsp;multipart&amp;nbsp;object.&amp;nbsp;Use&amp;nbsp;a&amp;nbsp;vector&amp;nbsp;of&lt;br /&gt;;;&amp;nbsp;vectors&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;preserve&amp;nbsp;order,&amp;nbsp;a&amp;nbsp;map&amp;nbsp;otherwise.&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;post&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http//example.org&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:multipart&amp;nbsp;[[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;My&amp;nbsp;Awesome&amp;nbsp;Picture&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;Content/type&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;image/jpeg&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;(clojure.java.io&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;file&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;pic.jpg&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)]]})&lt;br /&gt;;;&amp;nbsp;Multipart&amp;nbsp;values&amp;nbsp;can&amp;nbsp;be&amp;nbsp;one&amp;nbsp;of&amp;nbsp;the&amp;nbsp;following:&lt;br /&gt;;;&amp;nbsp;String,&amp;nbsp;InputStream,&amp;nbsp;File,&amp;nbsp;or&amp;nbsp;a&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;byte&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;array&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Basic&amp;nbsp;authentication&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.com/protected&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:basic&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;auth&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;pass&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]})&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.com/protected&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:basic&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;auth&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;user:pass&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;})&lt;br /&gt;&lt;br /&gt;;;&amp;nbsp;Query&amp;nbsp;parameters&lt;br /&gt;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://site.com/search&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;{:query&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;params&amp;nbsp;{&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;q&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;foo,&amp;nbsp;bar&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;}})&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; clj-http的API相当的简洁漂亮，使用起来非常便利，强烈推荐。题外，学习clojure的一个好方法就是为现有的java类库实现一些方便的clojure wrapper。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果你需要异步的http client，我会推荐http.async.client这个类库，它的API是异步形式的类似 Java的Future模式，对于clojure程序员来说应该更像是agent。&lt;br /&gt;&lt;br /&gt;名称：http.async.client&lt;br /&gt;主页：&lt;a href=&quot;https://github.com/neotyk/http.async.client&quot;&gt;https://github.com/neotyk/http.async.client&lt;/a&gt;&lt;br /&gt;依赖：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;[http.async.client&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;0.4.1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]&lt;/span&gt;&lt;/div&gt;例子：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(require&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;[http.async.client&amp;nbsp;:as&amp;nbsp;c])&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(with&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;open&amp;nbsp;[client&amp;nbsp;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;client)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let&amp;nbsp;[response&amp;nbsp;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;GET&amp;nbsp;client&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://neotyk.github.com/http.async.client/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(prn&amp;nbsp;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;done&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;response))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;await&amp;nbsp;response)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(prn&amp;nbsp;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;string&amp;nbsp;response))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(prn&amp;nbsp;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;status&amp;nbsp;response))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(prn&amp;nbsp;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;done&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;response))))&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;输出：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;DOCTYPE&amp;nbsp;html&amp;nbsp;&lt;img src=&quot;http://www.blogjava.net/Images/dot.gif&quot;  alt=&quot;&quot; /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/dot.gif&quot;  alt=&quot;&quot; /&gt;&lt;br /&gt;{:code&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;,&amp;nbsp;:msg&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;OK&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;,&amp;nbsp;:protocol&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;HTTP/1.1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;,&amp;nbsp;:major&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;,&amp;nbsp;:minor&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;更多例子：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;POST&amp;nbsp;client&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://example.com&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;:body&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;hello&amp;nbsp;world&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;:timeout&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;3000&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)&lt;br /&gt;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;DELETE&amp;nbsp;client&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://example.com&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)&lt;br /&gt;(c&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;POST&amp;nbsp;client&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;http://example.com&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;:body&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;hello&amp;nbsp;world&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;:auth&amp;nbsp;{:type&amp;nbsp;:basic&amp;nbsp;:user&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;admin&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;:password&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;admin&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;})&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;请注意，这些方法都是异步调用的，你需要通过await来等待调用完成，或者通过done?来判断调用是否完成。&lt;br /&gt;http.async.client有个比较重要的特性就是对Http Chunked编码的支持，分别通过LazySeq和callback的方式支持，首先看将Http chunked变成一个lazy seq:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(with&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;open&amp;nbsp;[client&amp;nbsp;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;client)]&amp;nbsp;;&amp;nbsp;Create&amp;nbsp;client&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let&amp;nbsp;[resp&amp;nbsp;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;stream&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;seq&amp;nbsp;client&amp;nbsp;:get&amp;nbsp;url)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(doseq&amp;nbsp;[s&amp;nbsp;(s&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;string&amp;nbsp;resp)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(println&amp;nbsp;s))))&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;这里非常关键的一点是stream-seq返回的chunk序列，每取一个就少一个（通过first函数），也就是说每次调用first取到的chunk都不一样，是顺序递增，不可重复获取的。&lt;br /&gt;&lt;br /&gt;通过callback方式处理：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(with&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;open&amp;nbsp;[client&amp;nbsp;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;client)]&amp;nbsp;;&amp;nbsp;Create&amp;nbsp;client&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let&amp;nbsp;[parts&amp;nbsp;(ref&amp;nbsp;#{})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;(client&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;stream&amp;nbsp;client&amp;nbsp;:get&amp;nbsp;url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(fn&amp;nbsp;[state&amp;nbsp;body]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(dosync&amp;nbsp;(alter&amp;nbsp;parts&amp;nbsp;conj&amp;nbsp;(string&amp;nbsp;body)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[body&amp;nbsp;:&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;]))]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;do&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;something&amp;nbsp;to&amp;nbsp;@parts&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))&lt;/span&gt;&lt;/div&gt;自己传入一个callback函数接收chunk，比如这里用一个ref累积。&lt;br /&gt;&lt;br /&gt;http.async.client的详细文档看这里：&lt;a href=&quot;http://neotyk.github.com/http.async.client/docs.html&quot;&gt;http://neotyk.github.com/http.async.client/docs.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;最后，有兴趣还可以看下&lt;a href=&quot;https://github.com/ztellman/aleph&quot;&gt;aleph&lt;/a&gt;这个异步通讯的框架，它支持Http协议，也提供了http server和client的实现。不过它的API就没有那么简单明了，它的模型是类似go语言里利用channel做异步通讯的模型，http只是它的一个模块罢了，这是另一个话题了。&lt;br /&gt;&lt;img src =&quot;http://www.blogjava.net/killme2008/aggbug/369890.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/killme2008/&quot; target=&quot;_blank&quot;&gt;dennis&lt;/a&gt; 2012-02-13 18:57 &lt;a href=&quot;http://www.blogjava.net/killme2008/archive/2012/02/13/369890.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605345596/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/killme2008/archive/2012/02/13/369890.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Mon, 13 Feb 2012 18:57:00 +0800</pubDate><author>dennis</author><comments>http://www.blogjava.net/killme2008/archive/2012/02/13/369890.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/killme2008/archive/2012/02/13/369890.html</guid><dc:creator>dennis</dc:creator><fs:srclink>http://www.blogjava.net/killme2008/archive/2012/02/13/369890.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605345596/1503656</fs:itemid></item><item><title>Android和JavaSE对打印空字符串的区别</title><link>http://www.blogjava.net/amplifier/archive/2012/02/13/369867.html</link><wfw:comment>http://www.blogjava.net/amplifier/comments/369867.html</wfw:comment><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/amplifier/comments/commentRss/369867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/amplifier/services/trackbacks/369867.html</trackback:ping><description>昨天在调试一段Android程序的时候发现总是出现NullPointerException，是来自一句System.out.println()，但是把里面的内容分拆了几次都找不到哪里有null，最后发现居然是因为最终输出的字符串是null！&lt;br /&gt;&lt;br /&gt;一直以来，在JavaSE里，如果字符串本身是null，System.out.println()打印该字符串，会在终端输出&amp;#8220;null&amp;#8221;，而在Android里却是直接抛出NullPointerException，整个程序都会被终止。&lt;br /&gt;&lt;br /&gt;大家可以测试一下下面的语句在两种环境下的运行结果：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #008080; &quot;&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000; &quot;&gt;String&amp;nbsp;s&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080; &quot;&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #000000; &quot;&gt;System.out.println(s);&lt;/span&gt;&lt;/div&gt;&lt;img src =&quot;http://www.blogjava.net/amplifier/aggbug/369867.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/amplifier/&quot; target=&quot;_blank&quot;&gt;amp@java&lt;/a&gt; 2012-02-13 14:49 &lt;a href=&quot;http://www.blogjava.net/amplifier/archive/2012/02/13/369867.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605253399/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/amplifier/archive/2012/02/13/369867.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Mon, 13 Feb 2012 14:49:00 +0800</pubDate><author>amp@java</author><comments>http://www.blogjava.net/amplifier/archive/2012/02/13/369867.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/amplifier/archive/2012/02/13/369867.html</guid><dc:creator>amp@java</dc:creator><fs:srclink>http://www.blogjava.net/amplifier/archive/2012/02/13/369867.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605253399/1503656</fs:itemid></item><item><title>Clojure世界：日志管理——clojure.tools.logging</title><link>http://www.blogjava.net/killme2008/archive/2012/02/12/369822.html</link><wfw:comment>http://www.blogjava.net/killme2008/comments/369822.html</wfw:comment><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/369822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/369822.html</trackback:ping><description>&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 处理日志是任何一个产品级的程序都需要仔细处理的模块。在Java中，我们经常使用的是log4j就是一个日志框架。在clojure里，同样有一套日志框架&amp;#8212;&amp;#8212;clojure.tools.logging，它不仅提供了常用的日志输出功能，还屏蔽了Java各种日志框架之间的差异，如slf4j,commons-logging,log4j,java.util.logging等，让你可以透明地使用这些框架来处理日志。&lt;br /&gt;&lt;br /&gt;名称：clojure.tools.logging&lt;br /&gt;主页：&lt;a href=&quot;https://github.com/clojure/tools.logging&quot;&gt;https://github.com/clojure/tools.logging&lt;/a&gt;&lt;br /&gt;依赖：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;[org.clojure/tools.logging&amp;nbsp;&quot;0.2.3&quot;]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;dependency&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;groupId&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;org.clojure&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;groupId&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;artifactId&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;tools.logging&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;artifactId&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;0.2.3&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;version&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000; &quot;&gt;dependency&lt;/span&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;使用：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(ns&amp;nbsp;example.core&lt;br /&gt;&amp;nbsp;&amp;nbsp;(:use&amp;nbsp;[clojure.tools.logging&amp;nbsp;:only&amp;nbsp;(info&amp;nbsp;error)]))&lt;br /&gt;&lt;br /&gt;(defn&amp;nbsp;divide&amp;nbsp;[x&amp;nbsp;y]&lt;br /&gt;&amp;nbsp;&amp;nbsp;(try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(info&amp;nbsp;&quot;dividing&quot;&amp;nbsp;x&amp;nbsp;&quot;by&quot;&amp;nbsp;y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(/&amp;nbsp;x&amp;nbsp;y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(catch&amp;nbsp;Exception&amp;nbsp;ex&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(error&amp;nbsp;ex&amp;nbsp;&quot;There&amp;nbsp;was&amp;nbsp;an&amp;nbsp;error&amp;nbsp;in&amp;nbsp;calculation&quot;))))&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;常用宏和方法：&lt;br /&gt;1.除了上面例子的info和error宏，还可以包括warn,trace,debug,fatal等常用宏，分别对应相应的日志级别。这些方法会自动判断当前logger的级别是否有效，有效的前提下才会输出日志。也就是说在Java里，你经常需要这样：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #0000FF; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;(logger.isDebugEnabled())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.debug(x&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;plus&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;y&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;(x&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;y));&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;在使用 tools.logging的时候是不需要的，因为这些宏帮你做了这个判断。另外，我们在使用log4j的时候需要指定log的namespace，在tools.logging里不需要，默认会取当前的namespace也就是*ns*。&lt;br /&gt;最后，info还有个infof的方法，用于输出格式化日志：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(infof&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;%s&amp;nbsp;is&amp;nbsp;%d&amp;nbsp;years&amp;nbsp;old&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;kid&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)&lt;/span&gt;&lt;/div&gt;日志输出：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;2012&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;02&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;07&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;394&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;INFO&amp;nbsp;&amp;nbsp;log:&amp;nbsp;kid&amp;nbsp;is&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;years&amp;nbsp;old&lt;/span&gt;&lt;/div&gt;其他方法也有类似的如warnf,debugf等。&lt;br /&gt;2.spy宏，同时输出表达式的form和结果，例如&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;（spy&amp;nbsp;(&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;))&lt;/span&gt;&lt;/div&gt;输出日志&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;2012&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;02&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;47&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;415&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;DEBUG&amp;nbsp;log:&amp;nbsp;(&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;3&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;3.with-logs宏可以在将*out*和*err*流重定向到日志的情况下求值表达式，例如：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(with&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;logs&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;ns&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;(prn&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;hello&amp;nbsp;world&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;))&lt;/span&gt;&lt;/div&gt;输出日志：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;2012&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;02&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;17&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;32&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;592&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;INFO&amp;nbsp;&amp;nbsp;log:&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;hello&amp;nbsp;world&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;with-logs需要明确指定log-ns，默认out的输出级别是info，而err的级别是error，可以指定输出级别(with-logs [*ns* :info :error] ......)&lt;br /&gt;&lt;br /&gt;4.事务中（dosync中）的日志输出，tools.logging做了特殊处理，默认情况下当且仅当事务成功提交的时候并且日志级别是warn或者info会通过agent异步写入日志。tools.logging定义了一个全局的agent&amp;#8212;&amp;#8212;*logging-agent*。当判断当前是在事务中调用log宏，并且日志级别在集合*tx-agent-levels*内，就会在事务提交成功的时候将日志发送给*logging-agent*异步处理。可以通过*tx-agent-levels*改变使用agent输出日志的级别范围，默认是#{:info :warn}。还可以通过改变*force*变量来强制使用direct或者agent的方式输出日志,*force*可以为:agent或者:direct。&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(binding&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;force&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;:agent]&lt;br /&gt;&amp;nbsp;&amp;nbsp;(log&amp;nbsp;:info&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;hello&amp;nbsp;world&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;))&lt;/span&gt;&lt;/div&gt;这里特别使用了log宏，需要明确指定日志级别为info。&lt;br /&gt;&lt;br /&gt;5.默认日志框架的是从classpath查找的，查找的顺序是sl4j,commons-logging,log4j,java.util.logging，找到哪个可用就用哪个。如果你的classpath里存在多个日志框架，如同时存在sl4j和commons-logging，那么如果你希望强制使用commons-logging，可以通过改变*logger-factory*变量来使用：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(ns&amp;nbsp;example&lt;br /&gt;&amp;nbsp;&amp;nbsp;(:use&amp;nbsp;[clojure.tools.logging.impl&amp;nbsp;:only&amp;nbsp;[cl&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;factory]]))&lt;br /&gt;(binding&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;factory&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&amp;nbsp;(cl&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;factory)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;(info&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;hello&amp;nbsp;world&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;*logger-factory*是dynamic变量，可以通过binding改变（前面提到的*force*等变量也一样），如果不希望每次都用binding，而是全局改变，则需要特殊处理：&lt;br /&gt;&lt;div style=&quot;background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all&quot;&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000; &quot;&gt;(alter&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;root&amp;nbsp;(var&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;logger&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;factory&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;)&amp;nbsp;(constantly&amp;nbsp;(cl&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000; &quot;&gt;factory))) &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;其他logger factory还包括slf4j-factory,log4j-factory,jul-factory。&lt;br /&gt;&lt;br /&gt;6.每个日志框架的配置跟使用java没有什么两样，比如你用log4j，就需要在classpath下放置一个log4j.properties等。如果你希望用编程的方式配置，可以使用&lt;a href=&quot;http://github.com/malcolmsparks/clj-logging-config&quot;&gt;clj-logging-config&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src =&quot;http://www.blogjava.net/killme2008/aggbug/369822.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/killme2008/&quot; target=&quot;_blank&quot;&gt;dennis&lt;/a&gt; 2012-02-12 20:53 &lt;a href=&quot;http://www.blogjava.net/killme2008/archive/2012/02/12/369822.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605035594/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/killme2008/archive/2012/02/12/369822.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Sun, 12 Feb 2012 20:53:00 +0800</pubDate><author>dennis</author><comments>http://www.blogjava.net/killme2008/archive/2012/02/12/369822.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/killme2008/archive/2012/02/12/369822.html</guid><dc:creator>dennis</dc:creator><fs:srclink>http://www.blogjava.net/killme2008/archive/2012/02/12/369822.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/605035594/1503656</fs:itemid></item><item><title>J2EE秘籍（更新至2012.02.12精简版）</title><link>http://www.blogjava.net/frank1981/archive/2012/02/12/369813.html</link><wfw:comment>http://www.blogjava.net/frank1981/comments/369813.html</wfw:comment><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/frank1981/comments/commentRss/369813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/frank1981/services/trackbacks/369813.html</trackback:ping><description>&lt;p&gt;当今计算机图书浩如烟海，技术更新频繁，技术人员疲于奔命，漫游在图书网络之中，吸取着自己想要的知识。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;工作，学习，生活，每个人不可缺少的生命组成部分，但是，他们之间构成了复杂的依赖关系，生活和工作的压力，&lt;/p&gt;&lt;p&gt;带来了大量学习的需求，学习，进而提升能力是为了更好工作，更好的工作，进而获得更多的收入，实为更好的生活，&lt;/p&gt;&lt;p&gt;但是，大量的学习和工作占用了更多的时间，使生活质量降低。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;每个人，为了生活而工作，为了工作而学习，学习是当今非常重要的活动，因为，时代给我们带来的挑战更多，大家都想获得成功，但是，成功却是留给有准备之人。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;工作了几年之后，发现时间过的真快，被周围的90后比的有点显老，但是，到目前为止学习却占用掉我之前生命的2/3。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;是否可以降低记忆成本让我少花些时间一遍一遍翻着Java经典，一遍一遍谷歌百度。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;书堆的比自己还高，却不是著作等身，而是&amp;#8220;他作等身&amp;#8221;。&amp;#8220;养兵千日，用在一时&amp;#8221;，很多东西却在用到时候忘却了，悲催了。对这么多的书，看书时间成了问题，如果公交车和地铁上有机会坐着，都会有看书的欲望。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;书看到越多，当然了解的越多，但是忘却的更多，这是件恐怖的事。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;买来的书，花了钱，却只有一部分感觉是有用的，不看感觉浪费，看了又浪费时间。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;工作中费力解决了很多复杂的问题，最后却归根到基础知识忘记了。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;。。。。。。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;有一天，感觉自己是否可以动手做一下整理，以自己认为简单的方式，把一些东西记录下来呢？&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;终于，我开始了画我第一张技术图，接着第二张，。。。。。。，一张，一张，我希望有一天，会达到1000张。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;然后，我把这个主要由图表达思想的自己的&amp;#8220;著作&amp;#8221;起名为&amp;#8212;&amp;#8212;《J2EE工程师武功秘籍》，名字起的大了，主要是为了激励自己把图画的更好些，内容更有价值。否则，自己做这件事便失去了它的意义。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;现将最新文档上传分享，希望大家继续关注，多提意见，以便日后改进。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;万丈高楼平地起，写的太多记不住。记忆方法那个好，只有一遍再一遍。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;ReleaseNote:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;2011.09.30 共享22页草稿版。&lt;/p&gt;&lt;p&gt;2011.10.08 整理后，增加和完善一些内容，共享33页草稿版。&lt;/p&gt;&lt;p&gt;2011.10.10 修改标题字号，缩小图片大小，整理了图片索引，虽然增加8张图片，页数降至28页。因为考虑到名字为J2EE秘籍，实际为自娱自乐，遂共享28页版，改为娱乐版。同时，撤下33页版草稿版。&lt;/p&gt;&lt;p&gt;2011.10.11 共享增加书皮和目录导航32页娱乐版。&lt;/p&gt;&lt;p&gt;2011.10.27 调整版式，增加新的招式图，增加大师介绍附录，因为现在主要是以图为主，以后再逐渐完善文字部分，遂改名共享46页精简版。&lt;/p&gt;&lt;p&gt;2011.10.27 调整版式，增加新的招式图，增加大师介绍附录，因为现在主要是以图为主，以后再逐渐完善文字部分，遂改名共享46页精简版。&lt;/p&gt;&lt;p&gt;2011.11.12添加和修改招式图15张，增加参考资料附录，共享55页精简版。&lt;/p&gt;&lt;p&gt;2011.11.26 对很多旧图进行修改和重画，同时新增招式图11张，共享58页精简版。&lt;/p&gt;&lt;p&gt;2011.12.11 新增招式图6张，共享62页精简版。&lt;br /&gt;2011.12.25 新增招式图4张，共享64页精简版。&lt;br /&gt;2012.01.08 新增修改招式图9张，文档完成第一个100张图片(M1)，共享69页精简版。&lt;br /&gt;2012.01.29 新增招式图6张，共享72页精简版。&lt;br /&gt;2012.02.12 新增招式图6张，共享74页精简版。&lt;/p&gt;&lt;p&gt;Changes:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;2011.09.18 突然有个想法，自己动手，丰衣足食。&lt;/p&gt;&lt;p&gt;2011.10.02 由于内容太少，撤下。&lt;/p&gt;&lt;p&gt;2011.10.09 整理2张图片，并把所有图片按比例缩小。&lt;/p&gt;&lt;p&gt;2011.10.10 增加经典设计原则图片6张。&lt;/p&gt;&lt;p&gt;2011.10.11 增加书皮页，增加Java4种引用，classloader关系，DDL和DML,设计模式，线程设计模式图片5张。&lt;/p&gt;&lt;p&gt;2011.10.12 增加JAVASE招式2张，增加JAVAEE招式1张。&lt;/p&gt;&lt;p&gt;2011.10.25 增加大师简介附录。&lt;/p&gt;&lt;p&gt;2011.10.26 增加数据库招式3张。&lt;/p&gt;&lt;p&gt;2011.10.27 增加设计模式招式5张，JAVASE招式1张。&lt;/p&gt;&lt;p&gt;2011.11.05 增加设计模式招式6张。&lt;/p&gt;&lt;p&gt;2011.11.06 增加JAVASE招式3张。&lt;/p&gt;&lt;p&gt;2011.11.12 修改DDL和DML招式图1张，增加数据库范式图1张，增加HTTP和HTTPS区别图1张，增加网络分层图1张，修改Mina框架图1张，增加对象序列化和transient用法。添加参加参考资料2个。&lt;br /&gt;2011.11.19 增加Linux权限图，增加计算目录中文件个数，增加MVC架构图，增加Producer－consumer图。&lt;/p&gt;&lt;p&gt;2011.11.20 对一些旧图问题和风格进行修改，便于观看。&lt;/p&gt;&lt;p&gt;2011.11.26 增加冒泡排序1张，直接插入排序1张，选择排序1张，快速排序1张，死锁和活锁2张，增加排他锁和共享锁1张。&lt;/p&gt;&lt;p&gt;2011.12.03增加责任模式1张。 &lt;/p&gt;&lt;p&gt;2011.12.04增加内连接、外连接和全连接1张。 &lt;/p&gt;&lt;p&gt;2011.12.10增加RESTFul架构1张。&lt;/p&gt;&lt;p&gt;2011.12.11增加SQL逻辑判断1张，数据库模式一张，集合查询一张。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2011.12.18增加JSP自定义标签1张。&lt;/p&gt;&lt;p&gt;2011.12.25增加SELECT一般格式1张，CRUD模式1张，初始化和加载顺序1张。&lt;/p&gt;&lt;table id=&quot;span1325995073921&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p align=&quot;left&quot;&gt;&lt;span&gt;2011.12.29&lt;/span&gt;&lt;span&gt;增加&lt;/span&gt;&lt;span&gt;EJB2&lt;/span&gt;&lt;span&gt;分类&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张，&lt;/span&gt;&lt;span&gt;EJB2&lt;/span&gt;&lt;span&gt;结构&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张，&lt;/span&gt;&lt;span&gt;B/S&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;C/S&lt;/span&gt;&lt;span&gt;架构&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张。&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;&lt;span&gt;2011.12.30&lt;/span&gt;&lt;span&gt;增加&lt;/span&gt;&lt;span&gt;HTTP&lt;/span&gt;&lt;span&gt;上传文件&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张，&lt;/span&gt;&lt;span&gt;MIME &lt;/span&gt;&lt;span&gt;类型&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张。&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;&lt;span&gt;2011.12.31&lt;/span&gt;&lt;span&gt;增加&lt;/span&gt;&lt;span&gt;Cookie&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;Session&lt;/span&gt;&lt;span&gt;区别&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张。&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;&lt;span&gt;2012.01.07&lt;/span&gt;&lt;span&gt;修改&lt;/span&gt;&lt;span&gt;Overriding&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span&gt;Overloading&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;Hiding 1&lt;/span&gt;&lt;span&gt;张，&lt;/span&gt;&lt;span&gt;FTP&lt;/span&gt;&lt;span&gt;上传文件&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张。&lt;/span&gt;&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;&lt;span&gt;2012.01.08 &lt;/span&gt;&lt;span&gt;增加&lt;/span&gt;&lt;span&gt;JMX&lt;/span&gt;&lt;span&gt;创建&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;张。&lt;/span&gt;&lt;br /&gt;2012.01.14 增加常用开源协议1张。&lt;br /&gt;2012.01.20 增加Linux环境变量1张，面向思维总结1张。&lt;br /&gt;2012.01.28 增加索引类型1张、星型模式1张、雪花模式1张。&lt;br /&gt;2012.02.11 增加构建树1张、红黑树2张、Java&amp;#8220;+&amp;#8221;重载1张。&lt;br /&gt;2012.02.12 增加COBRA1张、泛型符号1张。&lt;br /&gt;&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------&lt;/p&gt;&lt;p mce_style=&quot;text-align: left;&quot;&gt;&lt;/p&gt;&lt;p mce_style=&quot;text-align: left;&quot;&gt;&lt;span&gt;最新版下载地址：&lt;/span&gt;&lt;/p&gt;&lt;p mce_style=&quot;text-align: left;&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://zhufeng1981.iteye.com/blog/1183362&quot; mce_href=&quot;http://zhufeng1981.iteye.com/blog/1183362&quot;&gt;&lt;font color=&quot;#006600&quot; face=&quot;宋体&quot;&gt;http://zhufeng1981.iteye.com/blog/1183362&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;img src =&quot;http://www.blogjava.net/frank1981/aggbug/369813.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/frank1981/&quot; target=&quot;_blank&quot;&gt;frank1981&lt;/a&gt; 2012-02-12 12:51 &lt;a href=&quot;http://www.blogjava.net/frank1981/archive/2012/02/12/369813.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/604973353/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/frank1981/archive/2012/02/12/369813.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Sun, 12 Feb 2012 12:51:00 +0800</pubDate><author>frank1981</author><comments>http://www.blogjava.net/frank1981/archive/2012/02/12/369813.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/frank1981/archive/2012/02/12/369813.html</guid><dc:creator>frank1981</dc:creator><fs:srclink>http://www.blogjava.net/frank1981/archive/2012/02/12/369813.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/604973353/1503656</fs:itemid></item><item><title>微博sdk的设计</title><link>http://www.blogjava.net/changedi/archive/2012/02/12/369810.html</link><wfw:comment>http://www.blogjava.net/changedi/comments/369810.html</wfw:comment><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/changedi/comments/commentRss/369810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/changedi/services/trackbacks/369810.html</trackback:ping><description>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 摘要: 框架介绍：
&lt;br&gt;主要分为几个部分，核心httpClient部分，认证相关的token部分和api调用部分。 
&lt;br&gt;
&lt;br&gt;Weibo这个类是一个主体核心，调用的入口。 
&lt;br&gt;
&lt;br&gt;当用户完成上面介绍的授权后，通过weibo这个类来调用api实现功能。
&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;a href='http://www.blogjava.net/changedi/archive/2012/02/12/369810.html'&gt;阅读全文&lt;/a&gt;&lt;img src =&quot;http://www.blogjava.net/changedi/aggbug/369810.html&quot; width = &quot;1&quot; height = &quot;1&quot; /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style=&quot;text-decoration:none;&quot; href=&quot;http://www.blogjava.net/changedi/&quot; target=&quot;_blank&quot;&gt;changedi&lt;/a&gt; 2012-02-12 11:23 &lt;a href=&quot;http://www.blogjava.net/changedi/archive/2012/02/12/369810.html#Feedback&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none;&quot;&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/604940705/BlogJavaDotNet/feedsky/s.gif?r=http://www.blogjava.net/changedi/archive/2012/02/12/369810.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><pubDate>Sun, 12 Feb 2012 11:23:00 +0800</pubDate><author>changedi</author><comments>http://www.blogjava.net/changedi/archive/2012/02/12/369810.html#Feedback</comments><guid isPermaLink="false">http://www.blogjava.net/changedi/archive/2012/02/12/369810.html</guid><dc:creator>changedi</dc:creator><fs:srclink>http://www.blogjava.net/changedi/archive/2012/02/12/369810.html</fs:srclink><fs:srcfeed>http://www.blogjava.net/rss.aspx</fs:srcfeed><fs:itemid>feedsky/BlogJavaDotNet/~1215462/604940705/1503656</fs:itemid></item></channel></rss>
