﻿<?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/icestream/</link><description>八戒的梦想:农妇,山泉,有点田</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:01:02 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:01:02 GMT</pubDate><ttl>60</ttl><item><title>Architexa的暴力破解</title><link>http://www.blogjava.net/icestream/archive/2010/06/15/323627.html</link><dc:creator>高老庄</dc:creator><author>高老庄</author><pubDate>Tue, 15 Jun 2010 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/icestream/archive/2010/06/15/323627.html</guid><wfw:comment>http://www.blogjava.net/icestream/comments/323627.html</wfw:comment><comments>http://www.blogjava.net/icestream/archive/2010/06/15/323627.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/icestream/comments/commentRss/323627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icestream/services/trackbacks/323627.html</trackback:ping><description><![CDATA[&nbsp;Architexa的前身是relo,这个工具在分析开源项目的源码时很好用,relo已经不再维护,变成了新的插件Architexa,其网址是http://www.architexa.com/,虽然说architexa东西不错，可惜需要付费.另外他的注册网站好像有问题，因此连评估也做不了，无奈之下，动了暴力破解的念头.下面即是暴力破解的过程，需要的人可以参考下.<br />
1.architexa 通过eclipse的update manager 下载后,在eclipse_HOME/plugins会存在几个jar和目录，如下:<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/plusinsA.png" width="804" height="122" /><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/plusinsB.png" width="813" height="225" /><br />
1.architexa 没有对编译后的代码混淆,先用java decompiler 反编译出如下的类:<br />
<ul>
    <li>com.architexa.diagrams.RSECore 位于com.architexa.diagrams_1.2.2.201006051418.jar中.</li>
    <li>com.architexa.rse.ConnectAccountDialog 位于com.architexa.intro_1.2.2.201006051418/ReloIntro.jar中</li>
</ul>
2.修改RSECore类的方法:<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;validInstall()<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span> <span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">AccountStatusUtils.testAccountValid())&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;email&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;AccountSettings.getStoredAccountEmail();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountSettings.getStoredAccountPassword();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;((email&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;(email.length()&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">))<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AccountErrorMsgs.displayErr(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Account&nbsp;Has&nbsp;Expired&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">11</span><span style="color: rgb(0, 0, 0);"> }<br />
</span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);"><br />
</span></div>
中间的判断可以完全拿掉，修改为如下即可:<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;validInstall()<br />
</span><span style="color: rgb(0, 128, 128);">2</span> <span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">4</span> <span style="color: rgb(0, 0, 0);">}</span></div>
<br />
3.修改ConnectAccountDialog类的代码(反编译后的代码有点长,这里不列出了)，最终改成如下即可:<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 128, 128);">1</span>&nbsp;<span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;okPressed_Internal()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.emailEntered&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.emailField.getText();<br />
</span><span style="color: rgb(0, 128, 128);">3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.passwordEntered&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.passwordField.getText();<br />
</span><span style="color: rgb(0, 128, 128);">4</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;AccountConnection&nbsp;ac&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;AccountConnection();<br />
</span><span style="color: rgb(0, 128, 128);">6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.enableOnOK)&nbsp;ac.setMenuToDisable(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.disableOnCancel);<br />
</span><span style="color: rgb(0, 128, 128);">7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.okPressed();<br />
</span><span style="color: rgb(0, 128, 128);">8</span> <span style="color: rgb(0, 0, 0);">}</span></div>
<br />
编译后将上述两个类放到对应的jar中，重启eclipse.<br />
<br />
4.在architexa的认证对话框，输入任意email和password,architexa 将重建索引.<br />
5.在某个java类的上下文菜单中，可以看到Open in Diagram 就可以生成类的布局图，类图和序列图了.可以通过工具栏上的button来输出图形.<br />
<br />
下面贴几个通过这个插件构成的图，欣赏下<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/spring_class.png" width="975" height="477" /><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/201006/spring_seq.png" width="932" height="1128" /><br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/icestream/aggbug/323627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icestream/" target="_blank">高老庄</a> 2010-06-15 17:34 <a href="http://www.blogjava.net/icestream/archive/2010/06/15/323627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hudson step by step</title><link>http://www.blogjava.net/icestream/archive/2010/01/25/310763.html</link><dc:creator>高老庄</dc:creator><author>高老庄</author><pubDate>Mon, 25 Jan 2010 10:58:00 GMT</pubDate><guid>http://www.blogjava.net/icestream/archive/2010/01/25/310763.html</guid><wfw:comment>http://www.blogjava.net/icestream/comments/310763.html</wfw:comment><comments>http://www.blogjava.net/icestream/archive/2010/01/25/310763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/icestream/comments/commentRss/310763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icestream/services/trackbacks/310763.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;hudson是开源社区用的较多的一个开源持续集成工具,因为其开源，使用方便,扩展性强,对既有构建系统耦合性低，受到了大家一致的好评.<br />
&nbsp;&nbsp;&nbsp;&nbsp;使用:<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;1.下载</strong>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hudson的官方网站<a href="https://hudson.dev.java.net/" target="_blank">https://hudson.dev.java.net/</a>下提供了下载<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;2.安装<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hudson以war包的方式提供,因此安装方式极其简单，直接放到服务器的相应目录下,这里放到tomcat的webapp下,启动后，访问<a href="http://localhost:8088/hudson">http://localhost:8088/hudson</a> 可以进入hudson的控制台页面.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="368" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/main.png" width="853" border="0" />&nbsp;&nbsp;<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;4.组织待构建的项目</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我们创建一个最为简单的任务.这个任务的目的是构建一个标准的java工程，将其中的源码编译，打包等.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回顾下一般的、最为简单的开发流程:开发人员开发代码，然后利用诸如ant,mvn等负责构建系统,然后执行测试,最后发布到服务器上.通常，每个项目都会有一个完整的脚本来自动化的做这件事,如何驱动自动化脚本的执行(什么时间点,以什么频率,管理构建结果)，是hudson提供给我们的功能，hudson不关注特定一次构建的内部过程,这对hudson是透明的.目前，hudson通过插件的方式，提供了对基于ant 、mvn等常见构建工具的支持.本质上，hudson是一个任务管理和驱动执行工具,只不过，它驱动的软件开发流程中的构建等过程.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;准备:解决我们特定一次构建中，做什么的问题.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基于测试的目的，我们创建一个示例java工程,结构如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img style="float: none" height="261" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/project.png" width="427" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;此项目的采用ant,构建,ant脚本如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">project&nbsp;</span><span style="color: #ff0000">basedir</span><span style="color: #0000ff">="."</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="build.hudsondemo"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;=================================&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;compile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=================================&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="compile"</span><span style="color: #ff0000">&nbsp;depends</span><span style="color: #0000ff">="prepare"</span><span style="color: #ff0000">&nbsp;description</span><span style="color: #0000ff">="compile&nbsp;the&nbsp;project&nbsp;to&nbsp;the&nbsp;bin"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">javac&nbsp;</span><span style="color: #ff0000">debug</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;destdir</span><span style="color: #0000ff">="${basedir}/bin"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">src&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="${basedir}/src"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">src&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="${basedir}/test"</span><span style="color: #ff0000">&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">classpath</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="${basedir}/lib"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*.jar"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">classpath</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">javac</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;=================================&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=================================&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="jar"</span><span style="color: #ff0000">&nbsp;depends</span><span style="color: #0000ff">="compile"</span><span style="color: #ff0000">&nbsp;description</span><span style="color: #0000ff">="jar&nbsp;the&nbsp;project"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="${basedir}/target"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">jar&nbsp;&nbsp;</span><span style="color: #ff0000">destfile</span><span style="color: #0000ff">="${basedir}/target/hudsondemo_${common.version}.jar"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="${basedir}/bin"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;=================================&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;prepare&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=================================&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="prepare"</span><span style="color: #ff0000">&nbsp;depends</span><span style="color: #0000ff">="clean"</span><span style="color: #ff0000">&nbsp;&nbsp;description</span><span style="color: #0000ff">="prepare&nbsp;the&nbsp;jar&nbsp;to&nbsp;the&nbsp;lib"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="${basedir}/lib"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="${common.libs.dir}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*.jar"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;=================================&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;prepare&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=================================&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="clean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">delete&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${basedir}/bin"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">delete</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">delete&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${basedir}/lib"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">delete</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="${basedir}/bin"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="${basedir}/lib"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">project</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;为了说明问题，我特意的设定两个构建时参数:<br />
&nbsp;&nbsp;&nbsp;&nbsp;common.libs.dir&nbsp;指出从什么位置获取编译项目所需要的jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;common.version&nbsp;指出构建的jar的版本号.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;5.<strong>配置hudson的通用配置</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据使用插件的多少，通用配置数量同，对上述的示例项目,我们需要配置&nbsp;ant&nbsp;和jdk(可选,如果需要指定用特定的jdk构建系统的话).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点击hudson主页面右上角的manger hudson,进入配置页面,有多项配置可以处理，但是目前仅仅需要用到System configurate 功能.在System configurate页面，可以如下的配置:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<img height="212" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/hudson_head.png" width="636" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;贴此图的目的是需要关注下home directory这个配置，默认是当前用户目录下的.hudson,可以更改，一般在环境变量中设定一个HUSDON_HOME即可，同时将原有目录下文件copy到新目录下，重启hudson即可.也可以用其他的方式，比如设定容器参数等来指定.<br />
&nbsp;&nbsp;&nbsp;&nbsp;上述配置取默认既可.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;配置jdk:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="192" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/hudson_jdk.png" width="749" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;配置ant:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="192" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/hudson_ant.png" width="749" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<strong>6.&nbsp;创建构建任务</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hudson能提供的功能都以任务存在.点击右上角的new job,将构建一个新的任务:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="310" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/newjob.png" width="1122" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;输入任务名称，并选择第二项.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;配置任务:解决如何安排构建任务的执行的问题.<br />
&nbsp;&nbsp;&nbsp;&nbsp;首先，我们需要指定如何保留构建历史,一种是基于时间的，保留多少天，一种是基于次数的，保留自当前开始多少次以内的.这里我们选择保留最新3次构建.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="120" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/discard_builds.png" width="1127" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;再次，我们需要指定利用什么版本ant执行构建，同时指定构建时参数.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="276" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/job_ant.png" width="1104" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;ant version 版本中，使用了在通用配置部分配置的ant.<br />
&nbsp;&nbsp;&nbsp;&nbsp;targets 中，指明了，每次构建时需要完成的target,可以指定多个target.<br />
&nbsp;&nbsp;&nbsp;&nbsp;build file 指明了，使用什么样的ant完成实际的构建过程.<br />
&nbsp;&nbsp;&nbsp;&nbsp;properties 指明了ant脚本中的使用的运行时参数.这些参数可以使用变量替换,hudson 会解析出实际的值再传给ant.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;这就是这个任务可以执行的最基本配置,保存,并点击右上角的build new ,可以立即执行一个构建.构建结果如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="182" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/build_results.png" width="290" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;红色表示失败构建,如果失败，可以在%HUDSON_HOME%\jobs\下查看对应任务构建的日志来排查问题.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;8.&nbsp;两个可能经常需要关注的配置.</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;1.每个job的 workspace.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height="166" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/advance.png" width="1124" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果不指定绝对路径，配置的ant等脚本就是相对这个工作空间的.在上面的例子中工作空间的用处不大，但是在一些其他类型的构建，比如从svn中签出代码构建时，用处就体现出来了，另外,一些hudson的插件，所利用的文件(构建脚本生成,这些插件不会去关注文件产生，而是对这些文件做二次处理)都是放到工作空间的,工作空间相当与构建系统和hudson的一个交流中介.推荐是每个项目有自己独立的工作空间.<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.自动构建的频率设定<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="197" alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/target.png" width="1124" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;也就是什么时候触发构建，三种方式:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当别的项目构建完毕后发生构建<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用cron表到式来指定频率,对cron表达式不熟悉的话，可以参考quartz(hudson内部使用的调度框架)相关的文档.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检测scm(svn、cvs等)的状态，如果检测到变化，自动发生构建.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;借助husdon,基本能做到无人值守构建和部署，不少插件可以利用，也可以开发自己的插件.上面的仅仅是一个例子而与，如果要应对实际工作中的问题，得好好研究才行.<br />
&nbsp;&nbsp;&nbsp;&nbsp;</p>
 <img src ="http://www.blogjava.net/icestream/aggbug/310763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icestream/" target="_blank">高老庄</a> 2010-01-25 18:58 <a href="http://www.blogjava.net/icestream/archive/2010/01/25/310763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>osgi 添加自定义命令</title><link>http://www.blogjava.net/icestream/archive/2010/01/22/310549.html</link><dc:creator>高老庄</dc:creator><author>高老庄</author><pubDate>Fri, 22 Jan 2010 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/icestream/archive/2010/01/22/310549.html</guid><wfw:comment>http://www.blogjava.net/icestream/comments/310549.html</wfw:comment><comments>http://www.blogjava.net/icestream/archive/2010/01/22/310549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/icestream/comments/commentRss/310549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icestream/services/trackbacks/310549.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;在使用osgi实现时,可以使用诸如install,start,stop这样的命令来管理bundle或者调用服务.有时我们可能想添加一些自定义命令.可以通过如下的步骤来实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.编写一个服务，实现如下的接口</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_33_169_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_169_Open_Text.style.display='none'; Codehighlighter1_33_169_Closed_Image.style.display='inline'; Codehighlighter1_33_169_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_33_169_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_33_169_Closed_Text.style.display='none'; Codehighlighter1_33_169_Open_Image.style.display='inline'; Codehighlighter1_33_169_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;CommandProvider&nbsp;</span><span id="Codehighlighter1_33_169_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_33_169_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_36_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_36_140_Open_Text.style.display='none'; Codehighlighter1_36_140_Closed_Image.style.display='inline'; Codehighlighter1_36_140_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_36_140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_36_140_Closed_Text.style.display='none'; Codehighlighter1_36_140_Open_Image.style.display='inline'; Codehighlighter1_36_140_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_36_140_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_36_140_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">3</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer&nbsp;a&nbsp;string&nbsp;(may&nbsp;be&nbsp;as&nbsp;many&nbsp;lines&nbsp;as&nbsp;you&nbsp;like)&nbsp;with&nbsp;help<br />
</span><span style="color: #008080">4</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;texts&nbsp;that&nbsp;explain&nbsp;the&nbsp;command.<br />
</span><span style="color: #008080">5</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getHelp();<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p><br />
如果想定义hello方法,可以如下实现该接口:<br />
</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Dictionary;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Properties;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.osgi.framework.console.CommandInterpreter;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.osgi.framework.console.CommandProvider;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.osgi.framework.BundleActivator;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.osgi.framework.BundleContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.osgi.framework.Constants;<br />
<img id="Codehighlighter1_368_1265_Open_Image" onclick="this.style.display='none'; Codehighlighter1_368_1265_Open_Text.style.display='none'; Codehighlighter1_368_1265_Closed_Image.style.display='inline'; Codehighlighter1_368_1265_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_368_1265_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_368_1265_Closed_Text.style.display='none'; Codehighlighter1_368_1265_Open_Image.style.display='inline'; Codehighlighter1_368_1265_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Activator&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;BundleActivator,CommandProvider&nbsp;&nbsp;</span><span id="Codehighlighter1_368_1265_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_368_1265_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BundleContext&nbsp;bundleContext</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_464_827_Open_Image" onclick="this.style.display='none'; Codehighlighter1_464_827_Open_Text.style.display='none'; Codehighlighter1_464_827_Closed_Image.style.display='inline'; Codehighlighter1_464_827_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_464_827_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_464_827_Closed_Text.style.display='none'; Codehighlighter1_464_827_Open_Image.style.display='inline'; Codehighlighter1_464_827_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;start(BundleContext&nbsp;context)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_464_827_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_464_827_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">start<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">context.getBundle().getLocation());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bundleContext</span><span style="color: #000000">=</span><span style="color: #000000">context;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.registerService(CommandProvider.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getName(),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AntherCommandProvider(),&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dictionary&nbsp;dictionary</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Properties();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dictionary.put(Constants.SERVICE_RANKING,&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.registerService(CommandProvider.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getName(),&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">,dictionary);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_888_958_Open_Image" onclick="this.style.display='none'; Codehighlighter1_888_958_Open_Text.style.display='none'; Codehighlighter1_888_958_Closed_Image.style.display='inline'; Codehighlighter1_888_958_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_888_958_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_888_958_Closed_Text.style.display='none'; Codehighlighter1_888_958_Open_Image.style.display='inline'; Codehighlighter1_888_958_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;stop(BundleContext&nbsp;context)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_888_958_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_888_958_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">end<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">context.getBundle().getLocation());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_986_1032_Open_Image" onclick="this.style.display='none'; Codehighlighter1_986_1032_Open_Text.style.display='none'; Codehighlighter1_986_1032_Closed_Image.style.display='inline'; Codehighlighter1_986_1032_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_986_1032_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_986_1032_Closed_Text.style.display='none'; Codehighlighter1_986_1032_Open_Image.style.display='inline'; Codehighlighter1_986_1032_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getHelp()&nbsp;</span><span id="Codehighlighter1_986_1032_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_986_1032_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">you&nbsp;are&nbsp;using&nbsp;the&nbsp;help&nbsp;command</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;_helloa(CommandInterpreter&nbsp;intp)<br />
<img id="Codehighlighter1_1083_1140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1083_1140_Open_Text.style.display='none'; Codehighlighter1_1083_1140_Closed_Image.style.display='inline'; Codehighlighter1_1083_1140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1083_1140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1083_1140_Closed_Text.style.display='none'; Codehighlighter1_1083_1140_Open_Image.style.display='inline'; Codehighlighter1_1083_1140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1083_1140_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1083_1140_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intp.println(</span><span style="color: #000000">"</span><span style="color: #000000">helloa&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1206_1263_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1206_1263_Open_Text.style.display='none'; Codehighlighter1_1206_1263_Closed_Image.style.display='inline'; Codehighlighter1_1206_1263_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1206_1263_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1206_1263_Closed_Text.style.display='none'; Codehighlighter1_1206_1263_Open_Image.style.display='inline'; Codehighlighter1_1206_1263_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;_hello(CommandInterpreter&nbsp;intp)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_1206_1263_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1206_1263_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intp.println(</span><span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.osgi.framework.console.CommandInterpreter;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.eclipse.osgi.framework.console.CommandProvider;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_184_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_184_336_Open_Text.style.display='none'; Codehighlighter1_184_336_Closed_Image.style.display='inline'; Codehighlighter1_184_336_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_184_336_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_184_336_Closed_Text.style.display='none'; Codehighlighter1_184_336_Open_Image.style.display='inline'; Codehighlighter1_184_336_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AntherCommandProvider&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;CommandProvider&nbsp;</span><span id="Codehighlighter1_184_336_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_184_336_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;_hello(CommandInterpreter&nbsp;intp)<br />
<img id="Codehighlighter1_233_289_Open_Image" onclick="this.style.display='none'; Codehighlighter1_233_289_Open_Text.style.display='none'; Codehighlighter1_233_289_Closed_Image.style.display='inline'; Codehighlighter1_233_289_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_233_289_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_233_289_Closed_Text.style.display='none'; Codehighlighter1_233_289_Open_Image.style.display='inline'; Codehighlighter1_233_289_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_233_289_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_233_289_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intp.println(</span><span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getName());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_316_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_316_334_Open_Text.style.display='none'; Codehighlighter1_316_334_Closed_Image.style.display='inline'; Codehighlighter1_316_334_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_316_334_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_316_334_Closed_Text.style.display='none'; Codehighlighter1_316_334_Open_Image.style.display='inline'; Codehighlighter1_316_334_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getHelp()&nbsp;</span><span id="Codehighlighter1_316_334_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_316_334_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
其中,通过CommandInterpreter类型的nextArgument()方法可以迭代出所有的命令参数.<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.注册服务<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果不将该接口注册为服务，这个hello命令将不产生任何作用.注册的服务名称必须是org.eclipse.osgi.framework.console.CommandProvider.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当系统中存在多个此接口的实现时,可以通过SERVICE_RANKING属性来决定了命令执行的顺序,既有最高值的服务将被优先执行.这种方式可以重载系统中已经存在的同名服务.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.执行命令<br />
&nbsp;&nbsp;&nbsp;&nbsp;请仔细体会输出结果<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/icestream/out.PNG" border="0" /><br />
</p>
   <img src ="http://www.blogjava.net/icestream/aggbug/310549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icestream/" target="_blank">高老庄</a> 2010-01-22 17:34 <a href="http://www.blogjava.net/icestream/archive/2010/01/22/310549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>平台、产品、项目三层结构下的配置解决方案</title><link>http://www.blogjava.net/icestream/archive/2009/11/04/301078.html</link><dc:creator>高老庄</dc:creator><author>高老庄</author><pubDate>Wed, 04 Nov 2009 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/icestream/archive/2009/11/04/301078.html</guid><wfw:comment>http://www.blogjava.net/icestream/comments/301078.html</wfw:comment><comments>http://www.blogjava.net/icestream/archive/2009/11/04/301078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/icestream/comments/commentRss/301078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icestream/services/trackbacks/301078.html</trackback:ping><description><![CDATA[先谈下这个解决方案的背景:<br />
&nbsp;&nbsp;&nbsp;&nbsp;假设一个公司的产品遵循的是先有基础平台,然后在此平台上构建不同的产品,最后每一个产品被实施到特定的项目,那么，他们就构成了一种层次化的结构.每一个层次,需要覆盖一些上一层次的配置或者创建新的配置,如何分割层次间的影响从而保证层次间的独立性，是一个挑战.<br />
&nbsp;&nbsp;&nbsp;&nbsp;任意层次,可能有多个模块或者组件构成，不同的组件间，配置的类型可能一样，但是配置的数据不一样,那么,如果在配置某个模块时，不比考虑其他模块的配置情况，那么这个模块就拥有开发时的独立性,当组件被集成到同一层次部署运行时，配置的合并和重组是一个问题,并且，组件间可能存在依赖关系,这种依赖关系同时产生了依赖组件间配置加载的优先级问题.<br />
&nbsp;&nbsp;&nbsp;&nbsp;成熟的软件，一般不会直接将第三方的软件集成，而是将其封装后在纳入进来,第三方组件的配置往往不具备配置的层次化或者模块独立性.在设计第三方组件的集成策略时，需要考虑使其拥有上述两种能力.<br />
&nbsp;&nbsp;&nbsp;&nbsp;解决上述问题，方式有很多种,我们谈论比较容易实现的一种.<br />
&nbsp;&nbsp;&nbsp;&nbsp;这种解决方案的基本思路如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;首先，设计一个特定的扩展名称的配置文件(模块配置索引文件,MCIF,xml格式)，此配置文件面向的是组件级别，即每个组件定义自己的MCIF.MCIF中定义若干配置类别,即名称空间,每一个名称空间负责完成一类配置，一般,一个名称空间对应一个配置获取接口.这个名称空间中仅仅配置所关注的配置的文件的相对位置(相对此MCIF),这样，最大化的减少了不同配置文件格式对MCIF的影响.<br />
&nbsp;&nbsp;&nbsp;&nbsp;每一个MCIF的根元素拥有一个parent属性,指向了上一层次,同一层次的MCIF的parent属性都相同.通过parent属性，配置的层次化就不是问题了.<br />
&nbsp;&nbsp;&nbsp;&nbsp;MCIF有两个特殊的名称空间:<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.register 定义了所支持的名称空间及其对应的配置解析器,这样,此配置框架就可以允许对名称空间进行扩展.<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.depends 定义了同一层次的模块间的依赖关系,这个是可选的，如果没有实现或者配置，同一层次的module即为平行的.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;当系统启动时,扫描所有的MCIF,并根据parent属性解析出一个层次关系,对每一个层次下module,参考相应的depends设置定义出一个依赖关系.<br />
&nbsp;&nbsp;&nbsp;&nbsp;当请求某特定的配置时,根据上述的两个关系完成配置的组合，并返回给使用者.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;公司最近的重构中，基于这个思想开发的配置小框架，很好完成了多层次，多组件的配置覆盖问题,配置相对以前更清晰、简单，配置过程中的关注点大大减少.
  <img src ="http://www.blogjava.net/icestream/aggbug/301078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icestream/" target="_blank">高老庄</a> 2009-11-04 15:45 <a href="http://www.blogjava.net/icestream/archive/2009/11/04/301078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开博手记</title><link>http://www.blogjava.net/icestream/archive/2009/11/01/300546.html</link><dc:creator>高老庄</dc:creator><author>高老庄</author><pubDate>Sun, 01 Nov 2009 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/icestream/archive/2009/11/01/300546.html</guid><wfw:comment>http://www.blogjava.net/icestream/comments/300546.html</wfw:comment><comments>http://www.blogjava.net/icestream/archive/2009/11/01/300546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/icestream/comments/commentRss/300546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icestream/services/trackbacks/300546.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工作三年有余,接触的东西零碎不堪,私下研究不少,可惜工作中很少使用,随着时间的久远而逐渐忘却,一直有个想法,能讲所学所思整理出来,以便日后参考查阅.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;长久以来，看别人的blog不少,虽然有深度的原创不多,确也给了我莫大的帮助,本着取于斯,回馈于斯的精神,决定也在网上选择一片信手涂鸦之地.几经斟酌,最终敲定了blogjava,希望能将这个blog坚持下去,见证一个尘世迷途小卒的成长历程.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;希望不至于虎头蛇尾,that't all!<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
  <img src ="http://www.blogjava.net/icestream/aggbug/300546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icestream/" target="_blank">高老庄</a> 2009-11-01 11:13 <a href="http://www.blogjava.net/icestream/archive/2009/11/01/300546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>