﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-邋遢居</title><link>http://www.blogjava.net/JetGeng/</link><description>我的Java天堂</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 16:49:35 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 16:49:35 GMT</pubDate><ttl>60</ttl><item><title>自创Grails学习使用视频 </title><link>http://www.blogjava.net/JetGeng/archive/2014/04/23/412848.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Wed, 23 Apr 2014 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2014/04/23/412848.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/412848.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2014/04/23/412848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/412848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/412848.html</trackback:ping><description><![CDATA[<p>在过去的一年中。断断续续的使用了一些Grails。用他做了点东西。觉得不错，所以希望更多的人来了解他。使用他。所以录制了一点视频，和大家分享。视频会不定期持续更新！</p>
<p>第一集 Grails 开发环境准备</p>
<p>http://v.youku.com/v_show/id_XNjUxNjgxMjA4.html</p>
<p>&nbsp;</p>
<p>第二集 配置使用 Grails Spring security</p>
<p>http://v.youku.com/v_show/id_XNjY2MDc4MDgw.html</p>
<p>&nbsp;</p>
<p>第三集&nbsp; Grails中数据库连接</p>
<p>http://v.youku.com/v_show/id_XNjk4NTM2NDgw.html</p><img src ="http://www.blogjava.net/JetGeng/aggbug/412848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2014-04-23 22:49 <a href="http://www.blogjava.net/JetGeng/archive/2014/04/23/412848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过vim和markdown编辑Evernote中的笔记</title><link>http://www.blogjava.net/JetGeng/archive/2013/05/31/400046.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Fri, 31 May 2013 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2013/05/31/400046.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/400046.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2013/05/31/400046.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/400046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/400046.html</trackback:ping><description><![CDATA[<h2>原起<br /></h2><p><a target="_blank" id="" href="http://evernote.com/">EverNote</a> 的强大已经无需多说。他自己有很好的客户端，不过那个只是对Windows和OS X。在linux下面就虾米菜了。就是Windows和OS X下面的客户端也存在一个致命的弱点：不支持 <em>MarkDown</em> 。 <br />不过有好人做了一个工具 <a target="_blank" id="" href="http://www.geeknote.me/">Geeknote</a> 让我们可以在任何装有python的机器上使用Evernote。 更强大的是他可以使用任何编辑器编辑笔记，支持 <em>MarkDown</em> 。 有如此好处还等什么啊赶紧用起来。<br />个人在使用的时候发现原版有点点不舒服的地方，做了点点小改动放在了 <a target="_blank" id="" href="https://github.com/jetgeng/geeknote">GitHub</a>。 具体是什么改动，先买个关子。</p><h2>安装</h2><h3>直接从源码安装 <br /></h3><ol><li>使用 git clone git@github.com:jetgeng/geeknote.git 命令下载源码<br /></li><li>进入 geeknote 目录。<br /></li><li>运行 python geeknote.py login 登录evernote<br /></li><li>通过 python geeknote.py create , python geeknote.py edit , python geeknote.py find 命令来创建，编辑和查询你的ervernote 中的笔记。<br /></li><li>通过 python geeknote.py settings --editor vim 命令把编辑Evernote的编辑器设定成我最喜欢的vim。 当然你可以设定成你喜欢的。<br /></li><li>这个时候你已经用上了GeekNote。 但是还会有点不爽。最起码我这个时候不爽。</li></ol><h2>不爽的地方</h2><ol><li>当我用python geeknote.py edit 命令使用vim打开我要编辑的笔记时,笔记居然没有把 <em>MarkDown</em> 语法给我高亮出来! 不爽！！<br /></li><li>输入命令一定要带一个什么python 之类的太繁，而且我tab的时候也没有给我把命令补全！在命令行中没有自动补全，太不爽了！！</li></ol><h2>改之<br /></h2><h2>让vim正确设定filetype</h2><p>在
vim中一般是根据文件的后缀名来识别该文件是什么类型。然后为他加载相应的语法高亮，代码补全什么的。在没有改动前geeknote是为笔记创建的临时
文件时没有后缀的。只是随机的创建一个形如 tmpsNbc8k这样的文件。所以Vim无法识别他是何种文件，就无法为他加载对于的语法高亮之类的。</p><p>既然找到原因了就先看一下geeknote是否有什么地方可以设定，让他产生的临时文件有后缀。最后在editor.py文件中发现了这么一行代码： <em>(tmpFileHandler, tmpFileName) = tempfile.mkstemp()</em> 。 直接没有给任何后缀的想法。<br />那就加上吧。 <br />我所做的动作就是这个，给他加上了一个文件后缀的设定。<br />通过python geeknote settings --suffix suffix 这样的命令来设定零时文件的后缀。这样语法高亮，代码补全就回来了。小爽一下！</p><h3>命令行自动补全 <br /></h3><p>这个其实geeknote已经想到了，而且已经做了。代码仓库中的那个 bash_completion/geeknote 文件就是干这个活的。 所以我只要把这个文件copy到 /etc/bash_completion.d/ 下就可以了。<br />但是copy进去后没有达到我想要的效果。没有自动补全。最后发现是geeknote配置的补全命令和我们执行的时候不一致。<br />下面要做的就是把它们搞一致了。<br />我的操作步骤如下：<br />1. chmod +x geeknote.py 给geeknote.py加上可执行权限。<br />2. 将geeknote.py所在路径加入到PATH中去。<br />3. 修改 /etc/bash_completion.d/geeknote 文件中的 geeknote 为geeknote.py 这个在我上面提到的github中可以找到。</p><p>这个时候在新开一个控制台，输入 geeknote.py tab 可以自动补全了。小爽一下！</p><img src ="http://www.blogjava.net/JetGeng/aggbug/400046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2013-05-31 22:57 <a href="http://www.blogjava.net/JetGeng/archive/2013/05/31/400046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Gemini测试小工具</title><link>http://www.blogjava.net/JetGeng/archive/2011/07/22/354828.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Thu, 21 Jul 2011 17:01:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2011/07/22/354828.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/354828.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2011/07/22/354828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/354828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/354828.html</trackback:ping><description><![CDATA[<br />
<div class="body">
<div id="gemini" class="section">
<h1>Gemini测试小工具<a title="永久链接至标题" href="#gemini" class="headerlink">&#182;</a></h1>
<table rules="none" frame="void" class="docutils field-list">
     <colgroup><col class="field-name">
     <col class="field-body">
     </colgroup>
     <tbody valign="top">
         <tr class="field">
             <th class="field-name">作 者:</th>
             <td class="field-body">Jet Geng</td>
         </tr>
         <tr class="field">
             <th class="field-name">日 期:</th>
             <td class="field-body">2011-07-22</td>
         </tr>
     </tbody>
</table>
<div id="id1" class="section">
<h2>概述<a title="永久链接至标题" href="#id1" class="headerlink">&#182;</a></h2>
<p>在 <em>Blueprint</em> 起步中我们已经成功的通过 <em>Blueprint</em> 容器创建了一个POJO。我们只是通过log的方式查看到我们的POJO已经被创建了。无法深入的去了解容器内部Bean的运行状态和行为。
所以才有必要创建一个Gemini控制台这样的程序。这个控制台最初的需求是：</p>
<blockquote>
<div>
<ul class="simple">
     <li>能够动态查看特定的Bean是否被创建。</li>
     <li>能够动态的获取特定的Bean。</li>
     <li>能够检查特定Bean的行为是否正确。</li>
</ul>
</div>
</blockquote>
</div>
<div id="id2" class="section">
<h2>解决方案<a title="永久链接至标题" href="#id2" class="headerlink">&#182;</a></h2>
<dl class="docutils">
<dt>为了解决以上的问题。我做了一个小工具。 这个小工具的目的让客户的动态脚本能在最终的目标环境中运行。使用方式如下：</dt>
<dd>
<ol class="first last arabic simple">
     <li>从 git://github.com/jetgeng/OSGi.git 下载 <strong>org.gunn.gemini.console</strong> 和 <strong>org.codehaus.groovy</strong> 这两个项目。</li>
     <li>并把这两项目加入到你的TargetPlatform中。</li>
     <li>使用 <strong>invokegv</strong> 来运行groovy脚本。
     <ol class="arabic">
         <li>直接在命令行输入脚本。例如： <tt class="docutils literal"><span class="pre">invokegv</span> <span class="pre">print</span> <span class="pre">act.getBean(''myPOJO'')</span></tt></li>
         <li>通过输入Groovy文件。例如： <tt class="docutils literal"><span class="pre">invokegv</span> <span class="pre">file:///Users/Puer/.../script.groovy</span></tt></li>
     </ol>
     </li>
</ol>
</dd>
</dl>
<div class="admonition note">
<p class="first admonition-title">注解</p>
<p class="last">在Groovy脚本中有一个内建的变量 <strong>act</strong> ， 他又一个叫做 <strong>getBean</strong> 的方法。通过这个方法你可以获得当前 <strong>OSGi</strong> 平台中所有的BlueprintContainer中的组件。他的输入参数时Bean或Service的id。
如果是使用Groovy文件的形式，注意文件的url格式。他是通过如下的正则表达式 <tt class="docutils literal"><span class="pre">file:\\/{2}(\\/[:\\w\\.]+)+</span></tt> 进行验证的。并且路径中暂时不支持中文。</p>
</div>
<p>这个周末(23或24日)完成一个简单的录屏，来演示这个小工具的使用。</p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/354828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2011-07-22 01:01 <a href="http://www.blogjava.net/JetGeng/archive/2011/07/22/354828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Blueprint 使用手记</title><link>http://www.blogjava.net/JetGeng/archive/2011/07/10/354034.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sun, 10 Jul 2011 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2011/07/10/354034.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/354034.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2011/07/10/354034.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/354034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/354034.html</trackback:ping><description><![CDATA[1 概述<br />
Blueprint 使用手记 Jet Geng<br />
July 10, 2011<br />
Blueprint 是 OSGi Service Platform Enterprise Specification 标准的一 部分。很多最佳实践中也都推荐在应用程序中使用他。最近在项目中用他 来发布和应用服务。感觉效果不错。所以就有了这篇使用手记!欢迎各位 看官拍砖!<br />
2 配置环境<br />
我们在前期找到了两个 Blueprint 的实现:一个是 Apache 的 aries,另 外一个就是 Eclipse 的 Gemini。最后选择了 Gemini。做出这样的决定出于 两点考虑:<br />
&#8226; Blueprint的标准就是由Spring提出。<br />
&#8226; Gemini的初始代码由Srping所捐献。 下面我就简单介绍一下环境的配置过程:<br />
&#8226; 从http://eclipse.org/gemini/ 下载 Gemini 的合适的版本。我们 采用的是 1.0.0M1。并解压到路径 A<br />
&#8226; 从http://static.springsource.org/downloads/nightly/milestone-download. php下载 spring-osgi-2.0.0.M1-with-dependencies。并解压到路径 B。 他里面包括了 Gemini 所依赖的 bundle。说白了也就是 SpringFrame- work。<br />
&#8226; Eclipse 中新建一个 Target Platform。把上述的路径 A和 B 加入到新 建的 Target Platform 中去。<br />
&#8226; 选择新建的 Target Platform 为当前活动的 Platform。 3 启航<br />
个人理解 Gemini 就是 OSGi 世界中的 IOC。既然是一个 IOC 框架,那 我们就从创建一个 Bean 开始吧!<br />
<br />
3.1&nbsp;&nbsp;&nbsp; 创建一个 Bean 首先我们来看一下我们要存入 Container 中的 POJO。<br />
Listing 1: POJOWillInContainer.java<br />
<div style="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"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;org.gunn.gemini.demo;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.slf4j.Logger;&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.slf4j.LoggerFactory;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
*&nbsp;This&nbsp;pojo&nbsp;will&nbsp;create&nbsp;by&nbsp;blueprint&nbsp;container&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Jet&nbsp;Geng&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;POJOWillInContainer&nbsp;{&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; "><br />
}<br />
LoggerFactory.getLogger(POJOWillInContainer.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;name&nbsp;;<br />
</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;age;<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setName(String&nbsp;name)&nbsp;{&nbsp;logger.info(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">the&nbsp;new&nbsp;name&nbsp;is:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;name);&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />
}<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setAge(String&nbsp;age)&nbsp;{&nbsp;logger.info(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">the&nbsp;new&nbsp;age&nbsp;value&nbsp;is:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;age);&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.age&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;age;<br />
}</span></div>
<br />
这个超级简单的一个 POJO,我们如何通过 Gemini 来创建他呢?我们通过 一个简单的配置文件。具体如下。<br />
Listing 2: pojoconfig.xml<br />
<br />
<div style="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"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">blueprint&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.osgi.org/xmlns/blueprint/v1.0.0"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="myPOJO"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.gunn.gemini.demo.POJOWillInContainer"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="name"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="JetGeng"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="age"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="32"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">blueprint</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
</span></div>
<br />
用过 spring 的兄弟,第一眼就能看明白这个配置文件说的是什么。其实就 是创建了一个 bean。到这里,我们所需要做的工作其实就已经完成了。下 面就可以通过 Debug 来启动了。<br />
3.2&nbsp;&nbsp;&nbsp; 运行 Blueprint 容器 首先把 pojoconfig.xml 文件放到 project path/OSGi INF/blueprint 目录<br />
下。或者在 MANiFEST.MF 文件中通过如下语句进行指定。 Blueprint-Bundle: config/account-data-context.xml, config/osgi-*.xml<br />
更多内容参考http://www.eclipse.org/gemini/blueprint/documentation/ reference/1.0.0.RC1/html/app-deploy.html中的 8.2 Blueprint Manifest Configuration Comparison。好了,我们可以启动我们的应用程序了。为了 能够让 blueprint 顺利的跑起来,我们必须要把 blueprint 相关 bundle 以及 他所依赖的 bundle 都加入到运行时中。 按照上图配置后,点击运行。我们<br />
Figure 1: Debug 配置<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jetgeng/debug_config.png" /><br />
将在控制台得到如下内容。<br />
<br />
控制台中的黑色行显示我们的 POJO 已经被 BlueprintContainer 创建<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/jetgeng/run_result.png" />
<br />
了,并且设定了相关属性。<br />
.<br />
这个部分的全部代码已经放到了 git://github.com/jetgeng/OSGi.git 中了。 感兴趣的筒子可以 down 下来玩玩。<img src ="http://www.blogjava.net/JetGeng/aggbug/354034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2011-07-10 11:06 <a href="http://www.blogjava.net/JetGeng/archive/2011/07/10/354034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Graphviz显示树</title><link>http://www.blogjava.net/JetGeng/archive/2010/08/11/328524.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Wed, 11 Aug 2010 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2010/08/11/328524.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/328524.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2010/08/11/328524.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/328524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/328524.html</trackback:ping><description><![CDATA[<div class="wiki" id="content">
<div class="wikipage searchable">
<h1 id="用Graphviz显示树">用Graphviz显示树<a class="anchor" href="#用Graphviz显示树" title="Link to this section"> <br />
</a></h1>
<h2 id="缘起">缘起<a class="anchor" href="#缘起" title="Link to this section"> <br />
</a></h2>
<p>
前几天不知道那根筋搭错，又拿出了大学时候买的一本讲算法的书翻了起来。想起当年学习Tree的时候，看着数据结构凭空去想那颗倒着的树。那个叫做苦啊。所以就像有没有什么办法让Tree自己画出这样的结构图出来。
</p>
<h2 id="动手">动手<a class="anchor" href="#动手" title="Link to this section"> <br />
</a></h2>
<p>
既然想到了，就动手做把。因为以前用Graphviz画过一点mindmap，类图之类的小东西。让我一下子就想到了，我只要能从Tree结构中方便的输出成一个能绘制出对应树结构的Graphviz脚本就可以。这应该是代价最小的做法。
呵呵，废话不多说了。看看的Tree的代码吧！ <br />
</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;toString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;strValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;rout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuffer(</span><span style="color: #000000;">"</span><span style="color: #000000;">{rank=same&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(getLeftTree()&nbsp;&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strValue.append(root).append(ARROW).append(&nbsp;getLeftTree().getTreeNode()).append(</span><span style="color: #000000;">"</span><span style="color: #000000;">;\r</span><span style="color: #000000;">"</span><span style="color: #000000;">).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;append(&nbsp;getLeftTree());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rout.append(getLeftTree().getTreeNode()&nbsp;).append(ARROW).append(EXTEND).append(root);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strValue.append(EXTEND).append(root).append(</span><span style="color: #000000;">"</span><span style="color: #000000;">[label=\</span><span style="color: #000000;">"</span><span style="color: #000000;">\</span><span style="color: #000000;">"</span><span style="color: #000000;">,width=.1,style=invis];\r</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strValue.append(root).append(ARROW).append(EXTEND).append(root).append(</span><span style="color: #000000;">"</span><span style="color: #000000;">[style=invis];\r</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(getRightTree()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strValue.append(root).append(ARROW).append(&nbsp;getRightTree().getTreeNode()).append(</span><span style="color: #000000;">"</span><span style="color: #000000;">;\r</span><span style="color: #000000;">"</span><span style="color: #000000;">).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;append(&nbsp;getRightTree());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rout.append(ARROW).append(getRightTree().getTreeNode());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strValue.append(rout).append(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;[style=invis]&nbsp;}&nbsp;;\r</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;strValue.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p>
产生脚本的动作全部在这里完成了。我通过如下代码创建了一颗树 <br />
</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ITree</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;tree&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TreeImpl</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(</span><span style="color: #000000;">6</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.addNode(</span><span style="color: #000000;">3</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.addNode(</span><span style="color: #000000;">16</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.addNode(</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.addNode(</span><span style="color: #000000;">4</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.addNode(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.addNode(</span><span style="color: #000000;">10</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree.addNode(</span><span style="color: #000000;">30</span><span style="color: #000000;">);</span></div>
<p>最后得到的一副如下的图<br />
<img src="http://www.blogjava.net/images/blogjava_net/jetgeng/tree.png" alt="" border="0" /> <br />
</p>
<p>呵呵，这样的话就可以随时查看树的结构了，我们所需要做的只是把object toString一下就可以。</p>
<p>附上一些文件</p>
<p><a href="http://www.blogjava.net/Files/JetGeng/tree.rar ">演示的录屏文件</a> <br />
</p>
<a href="http://www.blogjava.net/Files/JetGeng/tree.zip" >完整的代码&nbsp; </a></div>
<br />
</div>

<img src ="http://www.blogjava.net/JetGeng/aggbug/328524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2010-08-11 12:59 <a href="http://www.blogjava.net/JetGeng/archive/2010/08/11/328524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始用Drupal构建小网站</title><link>http://www.blogjava.net/JetGeng/archive/2010/05/30/322313.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sun, 30 May 2010 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2010/05/30/322313.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/322313.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2010/05/30/322313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/322313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/322313.html</trackback:ping><description><![CDATA[<div class="wiki" id="content">
<div class="wikipage searchable">
<blockquote>
<p>
近来想了解一下关于网站建设方面的内容。自然而然的就找到了Drupal这个东西。刚开始没有发现他是多么的强大。抱着试试看的态度，
</p>
</blockquote>
<p>
搭建了一个环境跑跑看。看完之后惊呼强大！他的强大来源于他的高度的可扩展，丰富的模块，主题。让你可以不写一行代码构建出一个不错的网站来。
看到这么强大的东西，就禁不住好奇往里看。于是找到了一些资料特与大家共享：
书籍：
</p>
<ul>
    <li><a href="http://oreilly.com/catalog/9780596515805,Using" class="ext-link"><span class="icon">&nbsp;</span>Using Drupal</a>
    </li>
    <li>Drupal 6 Attachment Views
    </li>
    <li>Pro Drupal Development
    悄悄的说一声，这几本书在itpub上都有下载。
    </li>
</ul>
<p>
视频：
</p>
<ul>
    <li><a href="http://v.youku.com/v_show/id_XODc2Njk5ODQ=.html" class="ext-link"><span class="icon">&nbsp;</span>http://v.youku.com/v_show/id_XODc2Njk5ODQ=.html</a> 方医生发布在优酷上教学视频。非常之实用，作为入门真的很不错。在此向方医生表示感谢！
    </li>
</ul>
<p>
还有两个很不错的网站。
</p>
<ul>
    <li><a href="http://gotdrupal.com/" class="ext-link"><span class="icon">&nbsp;</span>http://gotdrupal.com/</a>
    </li>
    <li><a href="http://acquia.com/?x_lf_kid=17&amp;x_lf_kt=3&amp;_x_lf_kr=http%3A%2F%2Fwww.doitwithdrupal.com%2F" class="ext-link"><span class="icon">&nbsp;</span>http://acquia.com/?x_lf_kid=17&amp;x_lf_kt=3&amp;_x_lf_kr=http%3A%2F%2Fwww.doitwithdrupal.com%2F</a>
    </li>
</ul>
<p>
上面提供了很多高质量的教学视频。让我这个初学者很快对drupal有个直观和深入的了解。 <br />
</p>
<p>youtube.com上也有很多视频，有梯子的童鞋可以过去看看！<br />
</p>
</div>
</div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/322313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2010-05-30 23:44 <a href="http://www.blogjava.net/JetGeng/archive/2010/05/30/322313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Osgi常见错误分析</title><link>http://www.blogjava.net/JetGeng/archive/2010/05/14/321000.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Fri, 14 May 2010 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2010/05/14/321000.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/321000.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2010/05/14/321000.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/321000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/321000.html</trackback:ping><description><![CDATA[<img src="http://www.blogjava.net/images/blogjava_net/JetGeng/45001/o_osgi_error.png" alt="" border="0" /><br />
文中提到的代码<a title="castexception_src" href="http://www.blogjava.net /Files/JetGeng/castexception.zip">castexception_src</a> <br />
编译好了包括不同的版本org.gunn.castexception.supplier插件文件为<a title="castexception_bin" href="http://www.blogjava.net/Files/JetGeng/castexception_bin.rar">castexception_bin</a>
 
 
<img src ="http://www.blogjava.net/JetGeng/aggbug/321000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2010-05-14 19:15 <a href="http://www.blogjava.net/JetGeng/archive/2010/05/14/321000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复制文件到已存在的Jar</title><link>http://www.blogjava.net/JetGeng/archive/2009/11/26/303797.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Thu, 26 Nov 2009 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2009/11/26/303797.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/303797.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2009/11/26/303797.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/303797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/303797.html</trackback:ping><description><![CDATA[<div>
<h2 id="问题">问题
</h2>
<p>
这两天在写一个小东西。这个小东西是一个大东西的一部分。其实也就是其中的一两个类。而这个大东西需要部署到一个特定的环境中去运行。所以有一堆的限制条
件，比如什么配置文件啊，包名，版本之类的什么东西。稍微有点差错就没有办法运行。需要正确得到这些东西需要一个很庞大且冗长的构建过程。而我写的也就是
两三个类，所以最直接的方式就是把我写的<strong>java</strong>
文件编译或的<strong>class</strong>
文件直接复制到jar文件中。
完成这样工作有好几中方式，最直接的方式就是<strong>纯手工打造</strong>
</p>
<hr />
<p>
<img src="http://dl.javaeye.com/upload/attachment/172893/df442e67-e32c-3861-bc55-5581d3211172.png" alt="GraphViz image" width="432" height="473" /></p>
<p>
<strong>PS:</strong>
这种方式费时费力，需要在不同的窗体间进行切换。例如我现在就在Eclipse、WinRaR和Windows资源管理器间切换。
</p>
<h2 id="解决过程">解决过程
</h2>
<p>
如何避免这个过程呢，尽量不用人来参与其中。这个肯定就是让一个小程序来把这几个动作连接起来。而且还要能够方便变动。比如我现在不想往<strong>a.jar</strong>
里面copy了。我想向<strong>b.jar</strong>
中复制了。所以就想到了脚本。对让脚本来完成这样的事情。第一反应想到的是<strong>ant</strong>
</p>
<h3 id="Ant我的主角">Ant 我的主角
</h3>
<p>
<a href="http://ant.apache.org/">&nbsp;
Ant</a>
是
何须人，就不用我多说了。其实我了解也不多，只是知道这个小蚂蚁蛮力超大。下面就着手解决问题。第一反应就是找到一个直接copy的任务，把
fileset中的文件复制到jar文件中。但是遗憾的是我没有能够找到这样一个Task.这个时候我的思维陷入了困境。下面该怎么办？
</p>
<h3 id="困境">困境
</h3>
<p>
没有现成的东西，没有现成的能一步完成的东西？如何是好？
我是程序员，所以我我自己可以写一个task来满足这样的需求啊。对啊，我可以自己写的！正当我为这个想法兴奋不已时，正卷起袖子准备&#8220;大干&#8221;的时候。突然想起某人说过<strong> 不要重新造轮子！</strong>
。所以就追问了我自己一句：<strong>拐</strong>
角处会有什么呢？
</p>
<h3 id="我的拐角">我的拐角
</h3>
<p>
既然Ant有蛮力，我可否利用一下他的蛮力呢？通过如下的这么一个流程来达到我的目的。
</p>
<hr />
<p>
<img src="http://dl.javaeye.com/upload/attachment/172895/b13a55db-48b8-3572-a47f-d32dd5ecee1d.png" alt="GraphViz image" width="536" height="603" /></p>
<p>
这里用了一个temp文件夹作为中转，先解压，copy需要的文件，最后jar一下获得最后的更新好的jar。
最终获得了如下的build.xml</p>
<div>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="prepare"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mkdir&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${temp_dir}"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="build"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="prepare"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">echo&nbsp;</span><span style="color: #ff0000;">message</span><span style="color: #0000ff;">="unzip"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Uzip&nbsp;Jar&nbsp;file</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">echo</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">unjar&nbsp;</span><span style="color: #ff0000;">dest</span><span style="color: #0000ff;">="${temp_dir}"</span><span style="color: #ff0000;">&nbsp;src</span><span style="color: #0000ff;">="${comp_plugin}/${contain_plugin}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">unjar</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">copy&nbsp;</span><span style="color: #ff0000;">todir</span><span style="color: #0000ff;">="${temp_dir}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">fileset&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="./bin"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">fileset</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">copy</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">jar&nbsp;</span><span style="color: #ff0000;">update</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destfile</span><span style="color: #0000ff;">="c:/${contain_plugin}"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basedir</span><span style="color: #0000ff;">="${temp_dir}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">jar</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<pre>  </pre>
</div>
<h2 id="调整的过程">调整的过程
</h2>
<p>
看上去，所有问题都解决了。但是偏偏在使用的时候遇到了小问题。我的jar包是要在osgi环境下工作的。所以特别依赖MANIFEST.MF文件。偏偏<strong>jar</strong>
这个任务默认情况下会生成一个默认的MANIFEST.MF文件。如果任由他胡来的话，就全虾米了。所以要稍微调整一下。 <br />
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">jar&nbsp;</span><span style="color: #ff0000;">update</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destfile</span><span style="color: #0000ff;">="c:/${contain_plugin}"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basedir</span><span style="color: #0000ff;">="${temp_dir}"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manifest</span><span style="color: #0000ff;">="${temp_dir}/META-INF/MANIFEST.MF"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">jar</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
</div>
<pre style="display: none;" name="code" class="xml">&lt;jar update="true"
destfile="c:/${contain_plugin}"
basedir="${temp_dir}"
manifest="${temp_dir}/META-INF/MANIFEST.MF"&gt;
&lt;/jar&gt;
</pre>
&nbsp; <br />
<br />
<p>
这样就可以了。大功告成！！
</p>
</div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/303797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2009-11-26 18:07 <a href="http://www.blogjava.net/JetGeng/archive/2009/11/26/303797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Galileo: EMF-Databinding – Part 1--creation of the domain-model</title><link>http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sat, 07 Nov 2009 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/301576.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/301576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/301576.html</trackback:ping><description><![CDATA[<div>
<p>在我们创建领域模型前，我们有必要了解一下我们的模型用来表达什么内容。 所以我就先解释一下在这个系列文章中要实现应用。 <tt>假设Eclipse组织邀请你编写一个让他们管理贡献者和项目的应用程序。 </tt>
</p>
<p>我们需要创建一个模型来表达客户提供的信息。他们有可能如下图。 </p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/ecorescreen.png?w=510&amp;h=294" alt="" /></p>
<p>让我们进一步的看看这个模型。 </p>
<div>
<dl><dt>
Fundation
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_foundation.png?w=249&amp;h=53" alt="" width="249" height="53" /></dt><dd>
<p>fundation是这个模型的根，他拥有两个列表属性。 </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>projects:</em>
            </span>
            像EMF,Techonlogy,Platform这样的顶级项目。 </td>
        </tr>
        <tr>
            <td>
            <span><em>persons:</em>
            </span>
            参加一个或多个项目的人。
            </td>
        </tr>
    </tbody>
</table>
</dd><dt>
Project
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_project.png?w=230&amp;h=190" alt="" width="230" height="190" /></dt><dd>
<p>Eclipse项目拥有很多属性，比如项目开始和结束时间、项目的主页的url等等。下面列出我们最感兴趣的。 </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>subprojects:</em>
            </span>
            一个项目可以拥有多个子项目。子项目本身也可以拥有多个子项目。
            </td>
        </tr>
        <tr>
            <td>
            <span><em>parent:
            </em>
            </span>
            项目有一个父亲（除了顶级项目外）。这就意味着项目和子项目（project-subproject）的关系是一个双向的关系。
            </td>
        </tr>
        <tr>
            <td>
            <span><em>projectleads </em>
            </span>
            一个项目有多个项目领导人。 </td>
        </tr>
        <tr>
            <td>
            <span><em>committers </em>
            </span>
            一个项目可以拥有多个贡献者。
            </td>
        </tr>
    </tbody>
</table>
</dd><dt>
CommitterShip
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_committership1.png?w=176&amp;h=88" alt="" width="176" height="88" /></dt><dd>
<p>当一个用户成为一个项目的贡献者（Committer）时，这就建立了一个committership。他拥有一个开始时间和结束时间。另外我们还要记录下下面的属性。
</p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>project:</em>
            </span>
            和committership相关的项目。项目和committership是一个双向的关系。
            </td>
        </tr>
        <tr>
            <td>
            <span><em>person:</em>
            </span>
            参加项目的人。
            </td>
        </tr>
    </tbody>
</table>
</dd><dt>
Person
</dt><dt><img src="http://tomsondev.files.wordpress.com/2009/06/ecore_person.png?w=237&amp;h=111" alt="" width="237" height="111" /></dt><dd>
<p>贡献者或项目领导人的信息。我们关系的信息如下： </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>
            <span><em>committerships:</em>
            </span>
            用于保存和人相关的所有的committerships.这说明人和committership是一个双向关系。
            </td>
        </tr>
    </tbody>
</table>
</dd></dl>
</div>
<p>下面这张类图给出了关于上面模型的全貌。 </p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/project.png?w=510&amp;h=327" alt="" /></p>
<p>正如你所看到的，我把许多关系设成了双向关系。 As you noticed I modeled many of the relations as
bidirectional relations.
这个并不是严格要求所有地方都要这样，因为有的地方可以通过eComtainer来获取他的父亲。就像project-subproject一样。
但是包含关系（containment
relationship）在使用databinding的情况下就不太合适了。因为从子到父亲时没有对应feature，只能通过调用eContainer()方法来获得。
EMF提供了一个编辑器来创建你的Ecore-Model并把它保存成XMI格式。我们可以用它来创建测试数据。下图就是一个例子。</p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/xmi.png?w=510&amp;h=245" alt="" /></p>
</div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/301576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2009-11-07 22:41 <a href="http://www.blogjava.net/JetGeng/archive/2009/11/07/301576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Galileo: Improved EMF-Databinding-Support </title><link>http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html</link><dc:creator>Jet Geng</dc:creator><author>Jet Geng</author><pubDate>Sat, 07 Nov 2009 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html</guid><wfw:comment>http://www.blogjava.net/JetGeng/comments/301575.html</wfw:comment><comments>http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JetGeng/comments/commentRss/301575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JetGeng/services/trackbacks/301575.html</trackback:ping><description><![CDATA[<h2 style="clear: both;">1.译序</h2>
<p>在学习EMF-Databinding的时候发现了Tom Schindl的博客。他的博客中有一个关于EMF
Databinding的专题。感觉很不多。想尝试着翻译一下。 那么Tom
Schindl是何许人也？他是JFace项目的一个Contributor，在2007年<a href="http://www.eclipsezone.com/eclipse/forums/t90466.html" target="_top">Eclipse
Zone</a>
就曾经采访过他。 所以称他为EMF Databinding的专家一点也不过分。 </p>
<div style="margin-left: 0.5in; margin-right: 0.5in;">
<table summary="Note" border="0">
    <tbody>
        <tr>
            <td rowspan="2" valign="top" width="25" align="center"><img src="http://dl.javaeye.com/upload/attachment/152505/eb654d9f-9350-31dd-8508-c4210036a80f.gif" alt="" width="24" height="24" /></td>
            <th align="left">Note</th>
        </tr>
        <tr>
            <td colspan="2" valign="top" align="left">
            <p>原文为路径为http://tomsondev.bestsolution.at/2009/06/06/galileo-improved-emf-databinding-support/
            </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2 style="clear: both;">2. 原文<br />
</h2>
<div>
<div>
<div>
<p>我很高兴的宣布在Eclipse-Galileo中EMF-2.5已经开始支持新的Eclipse-Databinding API了。荣誉归Matthew
Hall，他审查我的代码，帮我整理支撑部分并且整理文档（详细内容在<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=262160" target="_top">bug
262160</a>
中） </p>
<p>几周前我成为了EMF项目的捐献者，现在我负责Databinding对EMF的支持模块。我将尽力修正API中的问题，回答Newsgroup中的问题。
</p>
<p>请允许我在介绍这个API的优点以及如何使用它之前声明一点：这个API还处于过渡期，他可能会有一些细微的变化。不过我们将会详细说明变化的部分。 </p>
<p>我将用一个系列文章来展现这个新的EMF-Databinding: </p>
<table summary="Simple list" border="0">
    <tbody>
        <tr>
            <td>第一部分：<a href="http://tomsondev.bestsolution.at/2009/06/06/galileo-emf-databinding-part-1/" target="_top">创建领域模型</a>
            </td>
        </tr>
        <tr>
            <td>第二部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-2/" target="_top">介绍新的Properties API</a>
            </td>
        </tr>
        <tr>
            <td>第三部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-3/" target="_top">用EMF-Databinding绑定到TreeViewer</a>
            </td>
        </tr>
        <tr>
            <td>第四部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-4/" target="_top">在master-detail模式中使用Properties API</a>
            </td>
        </tr>
        <tr>
            <td>第五部分：<a href="http://tomsondev.bestsolution.at/2009/06/07/galileo-emf-databinding-part-5/" target="_top">用EMF-Databinding绑定到TableViewer</a>
            </td>
        </tr>
        <tr>
            <td>第六部分：Write your own Property for unsupport Widget-Types </td>
        </tr>
        <tr>
            <td>第七部分：Make the storage system plugable</td>
        </tr>
    </tbody>
</table>
<p>为了让你快速进入EMF-Databinding中，我在前几天做了一个例子。 </p>
<p><img src="http://tomsondev.files.wordpress.com/2009/06/screen.png?w=300&amp;h=187" alt="" /></p>
<p>所有代码都是基于EPL协议，你可以在从<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.emf/org.eclipse.emf/examples/?root=Modeling_Project" target="_top">Eclipse-CVS</a>
处获得。 </p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/JetGeng/aggbug/301575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JetGeng/" target="_blank">Jet Geng</a> 2009-11-07 22:39 <a href="http://www.blogjava.net/JetGeng/archive/2009/11/07/301575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>