<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    高老莊

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

    2009年11月4日

     Architexa的前身是relo,這個工具在分析開源項目的源碼時很好用,relo已經(jīng)不再維護(hù),變成了新的插件Architexa,其網(wǎng)址是http://www.architexa.com/,雖然說architexa東西不錯,可惜需要付費(fèi).另外他的注冊網(wǎng)站好像有問題,因此連評估也做不了,無奈之下,動了暴力破解的念頭.下面即是暴力破解的過程,需要的人可以參考下.
    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類的代碼(反編譯后的代碼有點(diǎn)長,這里不列出了),最終改成如下即可:
    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 }

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

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

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





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

        hudson是開源社區(qū)用的較多的一個開源持續(xù)集成工具,因?yàn)槠溟_源,使用方便,擴(kuò)展性強(qiáng),對既有構(gòu)建系統(tǒng)耦合性低,受到了大家一致的好評.
        使用:
        1.下載 
            hudson的官方網(wǎng)站https://hudson.dev.java.net/下提供了下載
        2.安裝
            hudson以war包的方式提供,因此安裝方式極其簡單,直接放到服務(wù)器的相應(yīng)目錄下,這里放到tomcat的webapp下,啟動后,訪問http://localhost:8088/hudson 可以進(jìn)入hudson的控制臺頁面.
          
        4.組織待構(gòu)建的項目
            這里我們創(chuàng)建一個最為簡單的任務(wù).這個任務(wù)的目的是構(gòu)建一個標(biāo)準(zhǔn)的java工程,將其中的源碼編譯,打包等.
            回顧下一般的、最為簡單的開發(fā)流程:開發(fā)人員開發(fā)代碼,然后利用諸如ant,mvn等負(fù)責(zé)構(gòu)建系統(tǒng),然后執(zhí)行測試,最后發(fā)布到服務(wù)器上.通常,每個項目都會有一個完整的腳本來自動化的做這件事,如何驅(qū)動自動化腳本的執(zhí)行(什么時間點(diǎn),以什么頻率,管理構(gòu)建結(jié)果),是hudson提供給我們的功能,hudson不關(guān)注特定一次構(gòu)建的內(nèi)部過程,這對hudson是透明的.目前,hudson通過插件的方式,提供了對基于ant 、mvn等常見構(gòu)建工具的支持.本質(zhì)上,hudson是一個任務(wù)管理和驅(qū)動執(zhí)行工具,只不過,它驅(qū)動的軟件開發(fā)流程中的構(gòu)建等過程.
            準(zhǔn)備:解決我們特定一次構(gòu)建中,做什么的問題.
            基于測試的目的,我們創(chuàng)建一個示例java工程,結(jié)構(gòu)如下:
        
        此項目的采用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òu)建時參數(shù):
        common.libs.dir 指出從什么位置獲取編譯項目所需要的jar
        common.version 指出構(gòu)建的jar的版本號.

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

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

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

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

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

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

        在使用osgi實(shí)現(xiàn)時,可以使用諸如install,start,stop這樣的命令來管理bundle或者調(diào)用服務(wù).有時我們可能想添加一些自定義命令.可以通過如下的步驟來實(shí)現(xiàn)
        1.編寫一個服務(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.注冊服務(wù)
            如果不將該接口注冊為服務(wù),這個hello命令將不產(chǎn)生任何作用.注冊的服務(wù)名稱必須是org.eclipse.osgi.framework.console.CommandProvider.
           當(dāng)系統(tǒng)中存在多個此接口的實(shí)現(xiàn)時,可以通過SERVICE_RANKING屬性來決定了命令執(zhí)行的順序,既有最高值的服務(wù)將被優(yōu)先執(zhí)行.這種方式可以重載系統(tǒng)中已經(jīng)存在的同名服務(wù).
         3.執(zhí)行命令
        請仔細(xì)體會輸出結(jié)果

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

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

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

    主站蜘蛛池模板: 免费国产高清毛不卡片基地| 成年女人午夜毛片免费视频| 久久无码av亚洲精品色午夜| 久久精品国产亚洲av水果派| 免费一级毛片在线观看| 免费观看无遮挡www的小视频| 亚洲午夜无码AV毛片久久| 无码少妇一区二区浪潮免费| 久久99免费视频| 国产精品亚洲午夜一区二区三区| 亚洲日韩精品无码专区网站 | 免费人成视频x8x8入口| 91免费播放人人爽人人快乐| 亚洲色无码专区一区| 午夜网站免费版在线观看| 高潮毛片无遮挡高清免费| 日本亚洲免费无线码| 久久亚洲国产成人精品无码区| 日本免费中文字幕| 久久www免费人成看国产片| 91午夜精品亚洲一区二区三区| 免费大香伊蕉在人线国产| 西西人体免费视频| 亚洲精品偷拍视频免费观看| 亚洲成av人片在线天堂无 | av午夜福利一片免费看久久| 亚洲AV永久无码精品网站在线观看| 亚洲精品美女在线观看播放| 国产免费观看a大片的网站| 四虎影院免费在线播放| 热99re久久精品精品免费| a级毛片无码免费真人久久| jizz中国免费| 三年在线观看免费观看完整版中文| 日韩一区二区三区免费播放| 水蜜桃视频在线观看免费| 日韩大片在线永久免费观看网站| 免费毛片毛片网址| 美女被免费网站91色| 国内精品99亚洲免费高清| 久久一本岛在免费线观看2020|