高老莊

          八戒的夢想:農婦,山泉,有點田
          posts - 4, comments - 14, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2010年6月15日

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


          1.architexa 沒有對編譯后的代碼混淆,先用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類的代碼(反編譯后的代碼有點長,這里不列出了),最終改成如下即可:
          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 }

          編譯后將上述兩個類放到對應的jar中,重啟eclipse.

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

          下面貼幾個通過這個插件構成的圖,欣賞下





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

          2010年1月25日

              hudson是開源社區用的較多的一個開源持續集成工具,因為其開源,使用方便,擴展性強,對既有構建系統耦合性低,受到了大家一致的好評.
              使用:
              1.下載 
                  hudson的官方網站https://hudson.dev.java.net/下提供了下載
              2.安裝
                  hudson以war包的方式提供,因此安裝方式極其簡單,直接放到服務器的相應目錄下,這里放到tomcat的webapp下,啟動后,訪問http://localhost:8088/hudson 可以進入hudson的控制臺頁面.
                
              4.組織待構建的項目
                  這里我們創建一個最為簡單的任務.這個任務的目的是構建一個標準的java工程,將其中的源碼編譯,打包等.
                  回顧下一般的、最為簡單的開發流程:開發人員開發代碼,然后利用諸如ant,mvn等負責構建系統,然后執行測試,最后發布到服務器上.通常,每個項目都會有一個完整的腳本來自動化的做這件事,如何驅動自動化腳本的執行(什么時間點,以什么頻率,管理構建結果),是hudson提供給我們的功能,hudson不關注特定一次構建的內部過程,這對hudson是透明的.目前,hudson通過插件的方式,提供了對基于ant 、mvn等常見構建工具的支持.本質上,hudson是一個任務管理和驅動執行工具,只不過,它驅動的軟件開發流程中的構建等過程.
                  準備:解決我們特定一次構建中,做什么的問題.
                  基于測試的目的,我們創建一個示例java工程,結構如下:
              
              此項目的采用ant,構建,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>

              為了說明問題,我特意的設定兩個構建時參數:
              common.libs.dir 指出從什么位置獲取編譯項目所需要的jar
              common.version 指出構建的jar的版本號.

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

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

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

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

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

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

          2010年1月22日

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

          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方法,可以如下實現該接口:

           

          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()方法可以迭代出所有的命令參數.
              2.注冊服務
                  如果不將該接口注冊為服務,這個hello命令將不產生任何作用.注冊的服務名稱必須是org.eclipse.osgi.framework.console.CommandProvider.
                 當系統中存在多個此接口的實現時,可以通過SERVICE_RANKING屬性來決定了命令執行的順序,既有最高值的服務將被優先執行.這種方式可以重載系統中已經存在的同名服務.
               3.執行命令
              請仔細體會輸出結果

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

          2009年11月4日

          先談下這個解決方案的背景:
              假設一個公司的產品遵循的是先有基礎平臺,然后在此平臺上構建不同的產品,最后每一個產品被實施到特定的項目,那么,他們就構成了一種層次化的結構.每一個層次,需要覆蓋一些上一層次的配置或者創建新的配置,如何分割層次間的影響從而保證層次間的獨立性,是一個挑戰.
              任意層次,可能有多個模塊或者組件構成,不同的組件間,配置的類型可能一樣,但是配置的數據不一樣,那么,如果在配置某個模塊時,不比考慮其他模塊的配置情況,那么這個模塊就擁有開發時的獨立性,當組件被集成到同一層次部署運行時,配置的合并和重組是一個問題,并且,組件間可能存在依賴關系,這種依賴關系同時產生了依賴組件間配置加載的優先級問題.
              成熟的軟件,一般不會直接將第三方的軟件集成,而是將其封裝后在納入進來,第三方組件的配置往往不具備配置的層次化或者模塊獨立性.在設計第三方組件的集成策略時,需要考慮使其擁有上述兩種能力.
              解決上述問題,方式有很多種,我們談論比較容易實現的一種.
              這種解決方案的基本思路如下:
              首先,設計一個特定的擴展名稱的配置文件(模塊配置索引文件,MCIF,xml格式),此配置文件面向的是組件級別,即每個組件定義自己的MCIF.MCIF中定義若干配置類別,即名稱空間,每一個名稱空間負責完成一類配置,一般,一個名稱空間對應一個配置獲取接口.這個名稱空間中僅僅配置所關注的配置的文件的相對位置(相對此MCIF),這樣,最大化的減少了不同配置文件格式對MCIF的影響.
              每一個MCIF的根元素擁有一個parent屬性,指向了上一層次,同一層次的MCIF的parent屬性都相同.通過parent屬性,配置的層次化就不是問題了.
              MCIF有兩個特殊的名稱空間:
              1.register 定義了所支持的名稱空間及其對應的配置解析器,這樣,此配置框架就可以允許對名稱空間進行擴展.
              2.depends 定義了同一層次的模塊間的依賴關系,這個是可選的,如果沒有實現或者配置,同一層次的module即為平行的.
              
              當系統啟動時,掃描所有的MCIF,并根據parent屬性解析出一個層次關系,對每一個層次下module,參考相應的depends設置定義出一個依賴關系.
              當請求某特定的配置時,根據上述的兩個關系完成配置的組合,并返回給使用者.
              
              公司最近的重構中,基于這個思想開發的配置小框架,很好完成了多層次,多組件的配置覆蓋問題,配置相對以前更清晰、簡單,配置過程中的關注點大大減少.

          posted @ 2009-11-04 15:45 高老莊 閱讀(216) | 評論 (0)編輯 收藏

          2009年11月1日

                  工作三年有余,接觸的東西零碎不堪,私下研究不少,可惜工作中很少使用,隨著時間的久遠而逐漸忘卻,一直有個想法,能講所學所思整理出來,以便日后參考查閱.
                  長久以來,看別人的blog不少,雖然有深度的原創不多,確也給了我莫大的幫助,本著取于斯,回饋于斯的精神,決定也在網上選擇一片信手涂鴉之地.幾經斟酌,最終敲定了blogjava,希望能將這個blog堅持下去,見證一個塵世迷途小卒的成長歷程.
                   希望不至于虎頭蛇尾,that't all!
                  
                 

          posted @ 2009-11-01 11:13 高老莊 閱讀(154) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 双牌县| 莱西市| 江孜县| 元氏县| 阿鲁科尔沁旗| 嵊州市| 三江| 连江县| 岳池县| 彭山县| 大埔县| 潜江市| 古蔺县| 尉氏县| 嘉义市| 凤山县| 浑源县| 梅州市| 翼城县| 喜德县| 阿拉尔市| 东方市| 水富县| 和平县| 金山区| 邛崃市| 武强县| 嵩明县| 隆尧县| 上林县| 连南| 深水埗区| 正镶白旗| 漳浦县| 松溪县| 巴林左旗| 盘山县| 黄浦区| 苏尼特左旗| 禹城市| 瑞昌市|