高老莊

          八戒的夢(mèng)想:農(nóng)婦,山泉,有點(diǎn)田
          posts - 4, comments - 14, trackbacks - 0, articles - 3
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2010年1月22日

           Architexa的前身是relo,這個(gè)工具在分析開源項(xiàng)目的源碼時(shí)很好用,relo已經(jīng)不再維護(hù),變成了新的插件Architexa,其網(wǎng)址是http://www.architexa.com/,雖然說architexa東西不錯(cuò),可惜需要付費(fèi).另外他的注冊(cè)網(wǎng)站好像有問題,因此連評(píng)估也做不了,無奈之下,動(dòng)了暴力破解的念頭.下面即是暴力破解的過程,需要的人可以參考下.
          1.architexa 通過eclipse的update manager 下載后,在eclipse_HOME/plugins會(huì)存在幾個(gè)jar和目錄,如下:


          1.architexa 沒有對(duì)編譯后的代碼混淆,先用java decompiler 反編譯出如下的類:
          • com.architexa.diagrams.RSECore 位于com.architexa.diagrams_1.2.2.201006051418.jar中.
          • com.architexa.rse.ConnectAccountDialog 位于com.architexa.intro_1.2.2.201006051418/ReloIntro.jar中
          2.修改RSECore類的方法:
           1 public static boolean validInstall()
           2 {
           3     if (!AccountStatusUtils.testAccountValid()) {
           4       String email = AccountSettings.getStoredAccountEmail();
           5       AccountSettings.getStoredAccountPassword();
           6       if ((email != null&& (email.length() > 0))
           7         AccountErrorMsgs.displayErr("Account Has Expired ");
           8       return false;
           9     }
          10     return true;
          11 }
          12
          中間的判斷可以完全拿掉,修改為如下即可:
          1 public static boolean validInstall()
          2 {
          3     return true;
          4 }

          3.修改ConnectAccountDialog類的代碼(反編譯后的代碼有點(diǎn)長(zhǎng),這里不列出了),最終改成如下即可:
          1 protected void okPressed_Internal() {
          2     this.emailEntered = this.emailField.getText();
          3     this.passwordEntered = this.passwordField.getText();
          4 
          5     AccountConnection ac = new AccountConnection();
          6     if (this.enableOnOK) ac.setMenuToDisable(!this.disableOnCancel);
          7     super.okPressed();
          8 }

          編譯后將上述兩個(gè)類放到對(duì)應(yīng)的jar中,重啟eclipse.

          4.在architexa的認(rèn)證對(duì)話框,輸入任意email和password,architexa 將重建索引.
          5.在某個(gè)java類的上下文菜單中,可以看到Open in Diagram 就可以生成類的布局圖,類圖和序列圖了.可以通過工具欄上的button來輸出圖形.

          下面貼幾個(gè)通過這個(gè)插件構(gòu)成的圖,欣賞下





          posted @ 2010-06-15 17:34 高老莊 閱讀(3410) | 評(píng)論 (14)編輯 收藏

              hudson是開源社區(qū)用的較多的一個(gè)開源持續(xù)集成工具,因?yàn)槠溟_源,使用方便,擴(kuò)展性強(qiáng),對(duì)既有構(gòu)建系統(tǒng)耦合性低,受到了大家一致的好評(píng).
              使用:
              1.下載 
                  hudson的官方網(wǎng)站https://hudson.dev.java.net/下提供了下載
              2.安裝
                  hudson以war包的方式提供,因此安裝方式極其簡(jiǎn)單,直接放到服務(wù)器的相應(yīng)目錄下,這里放到tomcat的webapp下,啟動(dòng)后,訪問http://localhost:8088/hudson 可以進(jìn)入hudson的控制臺(tái)頁(yè)面.
                
              4.組織待構(gòu)建的項(xiàng)目
                  這里我們創(chuàng)建一個(gè)最為簡(jiǎn)單的任務(wù).這個(gè)任務(wù)的目的是構(gòu)建一個(gè)標(biāo)準(zhǔn)的java工程,將其中的源碼編譯,打包等.
                  回顧下一般的、最為簡(jiǎn)單的開發(fā)流程:開發(fā)人員開發(fā)代碼,然后利用諸如ant,mvn等負(fù)責(zé)構(gòu)建系統(tǒng),然后執(zhí)行測(cè)試,最后發(fā)布到服務(wù)器上.通常,每個(gè)項(xiàng)目都會(huì)有一個(gè)完整的腳本來自動(dòng)化的做這件事,如何驅(qū)動(dòng)自動(dòng)化腳本的執(zhí)行(什么時(shí)間點(diǎn),以什么頻率,管理構(gòu)建結(jié)果),是hudson提供給我們的功能,hudson不關(guān)注特定一次構(gòu)建的內(nèi)部過程,這對(duì)hudson是透明的.目前,hudson通過插件的方式,提供了對(duì)基于ant 、mvn等常見構(gòu)建工具的支持.本質(zhì)上,hudson是一個(gè)任務(wù)管理和驅(qū)動(dòng)執(zhí)行工具,只不過,它驅(qū)動(dòng)的軟件開發(fā)流程中的構(gòu)建等過程.
                  準(zhǔn)備:解決我們特定一次構(gòu)建中,做什么的問題.
                  基于測(cè)試的目的,我們創(chuàng)建一個(gè)示例java工程,結(jié)構(gòu)如下:
              
              此項(xiàng)目的采用ant,構(gòu)建,ant腳本如下:
              
          <?xml version="1.0" encoding="UTF-8"?>
          <project basedir="." name="build.hudsondemo">
              
          <!-- ================================= 
                    target: compile              
                   ================================= 
          -->
              
          <target name="compile" depends="prepare" description="compile the project to the bin">
                  
          <javac debug="true" destdir="${basedir}/bin">
                      
          <src path="${basedir}/src" />
                      
          <src path="${basedir}/test"  />
                      
          <classpath>
                          
          <fileset dir="${basedir}/lib">
                              
          <include name="*.jar"/>    
                          
          </fileset>
                      
          </classpath>
                  
          </javac>
              
          </target>
              
              
          <!-- ================================= 
                    target: jar              
                   ================================= 
          -->
              
          <target name="jar" depends="compile" description="jar the project">
                  
          <mkdir dir="${basedir}/target"/>
                  
          <jar  destfile="${basedir}/target/hudsondemo_${common.version}.jar">
                      
          <fileset dir="${basedir}/bin" />
                  
          </jar>
              
          </target>
              
              
          <!-- ================================= 
                    target: prepare              
                   ================================= 
          -->
              
          <target name="prepare" depends="clean"  description="prepare the jar to the lib">
                  
          <copy todir="${basedir}/lib">
                      
          <fileset dir="${common.libs.dir}">
                          
          <include name="*.jar"/>
                      
          </fileset>
                  
          </copy>
              
          </target>
              
              
          <!-- ================================= 
                        target: prepare              
                       ================================= 
          -->
              
          <target name="clean">
                  
          <delete dir="${basedir}/bin"></delete>
                  
          <delete dir="${basedir}/lib"></delete>
                  
                  
          <mkdir dir="${basedir}/bin" />
                  
          <mkdir dir="${basedir}/lib" />
              
          </target>
          </project>

              為了說明問題,我特意的設(shè)定兩個(gè)構(gòu)建時(shí)參數(shù):
              common.libs.dir 指出從什么位置獲取編譯項(xiàng)目所需要的jar
              common.version 指出構(gòu)建的jar的版本號(hào).

              5.配置hudson的通用配置
                  根據(jù)使用插件的多少,通用配置數(shù)量同,對(duì)上述的示例項(xiàng)目,我們需要配置 ant 和jdk(可選,如果需要指定用特定的jdk構(gòu)建系統(tǒng)的話).
                  點(diǎn)擊hudson主頁(yè)面右上角的manger hudson,進(jìn)入配置頁(yè)面,有多項(xiàng)配置可以處理,但是目前僅僅需要用到System configurate 功能.在System configurate頁(yè)面,可以如下的配置:

              
              貼此圖的目的是需要關(guān)注下home directory這個(gè)配置,默認(rèn)是當(dāng)前用戶目錄下的.hudson,可以更改,一般在環(huán)境變量中設(shè)定一個(gè)HUSDON_HOME即可,同時(shí)將原有目錄下文件copy到新目錄下,重啟hudson即可.也可以用其他的方式,比如設(shè)定容器參數(shù)等來指定.
              上述配置取默認(rèn)既可.
              
              配置jdk:
              
              
              配置ant:
              
              
               
             6. 創(chuàng)建構(gòu)建任務(wù)
                  hudson能提供的功能都以任務(wù)存在.點(diǎn)擊右上角的new job,將構(gòu)建一個(gè)新的任務(wù):
              
              輸入任務(wù)名稱,并選擇第二項(xiàng).

              配置任務(wù):解決如何安排構(gòu)建任務(wù)的執(zhí)行的問題.
              首先,我們需要指定如何保留構(gòu)建歷史,一種是基于時(shí)間的,保留多少天,一種是基于次數(shù)的,保留自當(dāng)前開始多少次以內(nèi)的.這里我們選擇保留最新3次構(gòu)建.
              
              再次,我們需要指定利用什么版本ant執(zhí)行構(gòu)建,同時(shí)指定構(gòu)建時(shí)參數(shù).
              
              ant version 版本中,使用了在通用配置部分配置的ant.
              targets 中,指明了,每次構(gòu)建時(shí)需要完成的target,可以指定多個(gè)target.
              build file 指明了,使用什么樣的ant完成實(shí)際的構(gòu)建過程.
              properties 指明了ant腳本中的使用的運(yùn)行時(shí)參數(shù).這些參數(shù)可以使用變量替換,hudson 會(huì)解析出實(shí)際的值再傳給ant.

              這就是這個(gè)任務(wù)可以執(zhí)行的最基本配置,保存,并點(diǎn)擊右上角的build new ,可以立即執(zhí)行一個(gè)構(gòu)建.構(gòu)建結(jié)果如下:
              
              紅色表示失敗構(gòu)建,如果失敗,可以在%HUDSON_HOME%\jobs\下查看對(duì)應(yīng)任務(wù)構(gòu)建的日志來排查問題.
              
              8. 兩個(gè)可能經(jīng)常需要關(guān)注的配置.
              1.每個(gè)job的 workspace.
                  
                  如果不指定絕對(duì)路徑,配置的ant等腳本就是相對(duì)這個(gè)工作空間的.在上面的例子中工作空間的用處不大,但是在一些其他類型的構(gòu)建,比如從svn中簽出代碼構(gòu)建時(shí),用處就體現(xiàn)出來了,另外,一些hudson的插件,所利用的文件(構(gòu)建腳本生成,這些插件不會(huì)去關(guān)注文件產(chǎn)生,而是對(duì)這些文件做二次處理)都是放到工作空間的,工作空間相當(dāng)與構(gòu)建系統(tǒng)和hudson的一個(gè)交流中介.推薦是每個(gè)項(xiàng)目有自己獨(dú)立的工作空間.
              2.自動(dòng)構(gòu)建的頻率設(shè)定
              
              也就是什么時(shí)候觸發(fā)構(gòu)建,三種方式:
                  當(dāng)別的項(xiàng)目構(gòu)建完畢后發(fā)生構(gòu)建
                  利用cron表到式來指定頻率,對(duì)cron表達(dá)式不熟悉的話,可以參考quartz(hudson內(nèi)部使用的調(diào)度框架)相關(guān)的文檔.
                  檢測(cè)scm(svn、cvs等)的狀態(tài),如果檢測(cè)到變化,自動(dòng)發(fā)生構(gòu)建.

              借助husdon,基本能做到無人值守構(gòu)建和部署,不少插件可以利用,也可以開發(fā)自己的插件.上面的僅僅是一個(gè)例子而與,如果要應(yīng)對(duì)實(shí)際工作中的問題,得好好研究才行.
              

          posted @ 2010-01-25 18:58 高老莊 閱讀(757) | 評(píng)論 (0)編輯 收藏

              在使用osgi實(shí)現(xiàn)時(shí),可以使用諸如install,start,stop這樣的命令來管理bundle或者調(diào)用服務(wù).有時(shí)我們可能想添加一些自定義命令.可以通過如下的步驟來實(shí)現(xiàn)
              1.編寫一個(gè)服務(wù),實(shí)現(xiàn)如下的接口

          1public interface CommandProvider {
          2    /**
          3     Answer a string (may be as many lines as you like) with help
          4     texts that explain the command.
          5     */

          6    public String getHelp();
          7
          8}


          如果想定義hello方法,可以如下實(shí)現(xiàn)該接口:

           

          import java.util.Dictionary;
          import java.util.Properties;

          import org.eclipse.osgi.framework.console.CommandInterpreter;
          import org.eclipse.osgi.framework.console.CommandProvider;
          import org.osgi.framework.BundleActivator;
          import org.osgi.framework.BundleContext;
          import org.osgi.framework.Constants;
          public class Activator implements BundleActivator,CommandProvider  {
              BundleContext bundleContext
          =null;
              
          public void start(BundleContext context) throws Exception {
                  System.out.println(
          "start" +context.getBundle().getLocation());
                  bundleContext
          =context;
                  context.registerService(CommandProvider.
          class.getName(), new AntherCommandProvider(), null);
                  Dictionary dictionary
          =new Properties();
                  dictionary.put(Constants.SERVICE_RANKING, 
          10);
                  context.registerService(CommandProvider.
          class.getName(), this,dictionary);
                  
              }


              
          public void stop(BundleContext context) throws Exception {
                  System.out.println(
          "end" +context.getBundle().getLocation());
              }


              
          public String getHelp() {
                  
          return "you are using the help command";
              }

              
              
          public void _helloa(CommandInterpreter intp)
              
          {
                  intp.println(
          "helloa "+ this.getClass().getName());
              }

              
              
          public void _hello(CommandInterpreter intp) throws Exception {
                  intp.println(
          "hello " + this.getClass().getName());
              }

          }


           

          import org.eclipse.osgi.framework.console.CommandInterpreter;
          import org.eclipse.osgi.framework.console.CommandProvider;

          public class AntherCommandProvider implements CommandProvider {

              
          public void _hello(CommandInterpreter intp)
              
          {
                  intp.println(
          "hello "+ this.getClass().getName());
              }

              
          public String getHelp() {
                  
          return null;
              }

          }


          其中,通過CommandInterpreter類型的nextArgument()方法可以迭代出所有的命令參數(shù).
              2.注冊(cè)服務(wù)
                  如果不將該接口注冊(cè)為服務(wù),這個(gè)hello命令將不產(chǎn)生任何作用.注冊(cè)的服務(wù)名稱必須是org.eclipse.osgi.framework.console.CommandProvider.
                 當(dāng)系統(tǒng)中存在多個(gè)此接口的實(shí)現(xiàn)時(shí),可以通過SERVICE_RANKING屬性來決定了命令執(zhí)行的順序,既有最高值的服務(wù)將被優(yōu)先執(zhí)行.這種方式可以重載系統(tǒng)中已經(jīng)存在的同名服務(wù).
               3.執(zhí)行命令
              請(qǐng)仔細(xì)體會(huì)輸出結(jié)果

          posted @ 2010-01-22 17:34 高老莊 閱讀(605) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 云安县| 微山县| 兴业县| 东阳市| 温宿县| 芷江| 边坝县| 开鲁县| 定兴县| 宽城| 呈贡县| 石狮市| 贵德县| 兴城市| 易门县| 泽州县| 东源县| 改则县| 新沂市| 贵定县| 永吉县| 南陵县| 长沙市| 吴堡县| 屯留县| 玉环县| 胶州市| 宁南县| 丽江市| 巫溪县| 德昌县| 贵州省| 湖北省| 兖州市| 青阳县| 鹰潭市| 巴马| 上林县| 乌拉特中旗| 巴塘县| 政和县|