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

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

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

    gr8vyguy@Blogjava

    NSIS腳本制作Java程序的EXE啟動(dòng)器

    NSIS調(diào)用外部程序的的命令是Exec,比如Exec "notepad", 將啟動(dòng)Windows的默認(rèn)文本編輯器Notepad。同樣的道理可以用"java -jar test.jar"啟動(dòng)test.jar。

    Name "Java Launcher"
    Caption 
    "Java Launcher"
    Icon 
    "Java Launcher.ico"
    OutFile 
    "Java Launcher.exe"

    SilentInstall silent
    AutoCloseWindow true
    ShowInstDetails nevershow

    Section 
    ""
        Exec 
    "java -jar test.jar"
    SectionEnd

    將上面這段NSIS腳本拷貝到一個(gè)nsi文件中,用NSIS編譯器編譯,將產(chǎn)生Java Launcher.exe。雙擊Java Launcher.exe將啟動(dòng)同一目錄下的test.jar文件,test.jar必須能夠用java  -jar test.jar啟動(dòng),也就是說test.jar的manifest的Library和Main-Class都要正確設(shè)值好。否則的話,你可以用java -classpath jar1;jar2 main_class來啟動(dòng)。

    如何編譯NSIS腳本請(qǐng)參看我之前的一篇隨筆 安裝程序制作系統(tǒng)NSIS(Nullsoft Scriptable Install System)

    上面這個(gè)啟動(dòng)器的一個(gè)問題是會(huì)打開一個(gè)控制臺(tái)窗口,這是因?yàn)橛昧薺ava命令,只要改為javaw就不會(huì)出現(xiàn)控制臺(tái)了。 另外一個(gè)問題是不夠健壯,只有當(dāng)java或者javaw命令在當(dāng)前目錄下或者在PATH上,才能正確啟動(dòng)。也許你想帶著一個(gè)JRE發(fā)布你的程序,那么就不能夠去啟動(dòng)系統(tǒng)的java命令。下面來加入尋找java命令目錄的功能,尋找的順序?yàn)?br>

    1. 當(dāng)前目錄下的jre子目錄, 如果你的發(fā)布程序里帶了一個(gè)jre,優(yōu)先啟動(dòng)。
    2. 環(huán)境變量JAVA_HOME 指定的目錄
    3. 在注冊(cè)表中,HKLM\SOFTWARE\JavaSoft\Java Runtime Environment下保存著安裝的JRE的目錄信息。
    4. 當(dāng)前目錄和系統(tǒng)環(huán)境變量PATH中的目錄
    腳本
    Name "Java Launcher"
    Caption 
    "Java Launcher"
    Icon 
    "Java Launcher.ico"
    OutFile 
    "Java Launcher.exe"
     
    SilentInstall silent
    AutoCloseWindow true
    ShowInstDetails nevershow
     
    Section 
    ""
      Call GetJRE
      Pop $R0
     
      
    ; change for your purpose (-jar etc.)
      StrCpy $0 '"$R0" -jar test.jar'
     
      SetOutPath $EXEDIR
      ExecWait $
    0
    SectionEnd
     
    Function GetJRE 
      Push $R0
      Push $R1
     
      ClearErrors
      StrCpy $R0 
    "$EXEDIR\jre\bin\javaw.exe"
      IfFileExists $R0 JreFound
      StrCpy $R0 
    ""
     
      ClearErrors
      ReadEnvStr $R0 
    "JAVA_HOME"
      StrCpy $R0 
    "$R0\bin\javaw.exe"
      IfErrors 
    0 JreFound
     
      ClearErrors
      ReadRegStr $R1 HKLM 
    "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
      ReadRegStr $R0 HKLM 
    "SOFTWARE\JavaSoft\Java Runtime Environment\$R1" "JavaHome"
      StrCpy $R0 
    "$R0\bin\javaw.exe"
     
      IfErrors 
    0 JreFound
      StrCpy $R0 
    "javaw.exe"
            
     JreFound:
      Pop $R1
      Exch $R0
    FunctionEnd
    Function GetJRE定義了尋找JRE的函數(shù),找到的javaw命令的路徑可以從R0中取回。R0,R1是NSIS預(yù)定義的寄存器,或者說是變量,Push $R0將R0的內(nèi)容壓進(jìn)堆棧,Pop $R0從堆棧中取回R0的內(nèi)容。這一點(diǎn)和匯編程序很像。GetJRE按定義好的順序判斷指定路徑下的是否存在javaw,如果是,返回。比如
        ReadEnvStr $R0 "JAVA_HOME"            讀入JAVA_HOME的值到R0
        StrCpy $R0 "$R0\bin\javaw.exe"           加上\bin\javaw.exe
        IfFileExists $R0 JreFound                  如果R0指定的文件存在,跳轉(zhuǎn)到JreFound
    ReadRegStr讀取注冊(cè)表中的鍵值。Exch $R0交換R0和堆棧頭元素的值。其他函數(shù)從字面上就可以理解了,不需要過多的解釋。

    最后要說明的是,這里用Execwait啟動(dòng)java命令,而不是Exec。區(qū)別是Exec馬上退出Java Launcher.exe的進(jìn)程,而Execwait不退出,也就是說用Execwait在關(guān)閉程序之前,有兩個(gè)活動(dòng)進(jìn)程,Java Launcher.exe和javaw.exe。這正是eclipse3.3之前的EXE啟動(dòng)器的情況,比如Eclipse3.2啟動(dòng)后,任務(wù)管理器里有eclipse.exe和javaw.exe兩個(gè)進(jìn)程。使用Execwait的原因是Exec在Windows 2000下出現(xiàn)的一個(gè)問題,在使用程序的過程中,如果用戶改變了桌面屬性,比如背景圖,系統(tǒng)就掛掉了。Eclipse在3.3之后改成了使用Java的Invocation Interface啟動(dòng)startup.jar。詳細(xì)的情況請(qǐng)看org.eclipse.equinox.executable項(xiàng)目。

    轉(zhuǎn)載請(qǐng)保留http://www.tkk7.com/xilaile/archive/2007/05/13/117039.html

    posted on 2007-05-12 19:23 gr8vyguy 閱讀(5443) 評(píng)論(4)  編輯  收藏 所屬分類: Scripting

    評(píng)論

    # re: NSIS腳本制作Java程序的EXE啟動(dòng)器 2007-10-10 07:56 enet

    歡樂豬 兄

    你好

    NSIS 我是新手,正在研究。

    問幾個(gè)傻傻的問題,請(qǐng)高人指點(diǎn)迷津。

    1、NSIS 打包.net 寫的web應(yīng)用程序。

    2、NSIS 還可以做升級(jí)包程序(效果,添加刪除內(nèi)不增加記錄,完成數(shù)據(jù)庫更新,文件更新)。

    感謝先。

      回復(fù)  更多評(píng)論   

    # re: NSIS腳本制作Java程序的EXE啟動(dòng)器 2012-11-25 08:37 王其軍

    還可以吧  回復(fù)  更多評(píng)論   

    # re: NSIS腳本制作Java程序的EXE啟動(dòng)器 2013-08-29 16:24 xiaomiao

    請(qǐng)問nsis怎么實(shí)現(xiàn)打包了的mysql,tomcat。jdk的自動(dòng)安裝  回復(fù)  更多評(píng)論   

    # re: NSIS腳本制作Java程序的EXE啟動(dòng)器 2013-10-24 03:55 于召書

    如果test.jar 需要傳一個(gè)參數(shù),該怎么寫?  回復(fù)  更多評(píng)論   

    <2007年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    公告

  • 轉(zhuǎn)載請(qǐng)注明出處.
  • msn: gr8vyguy at live.com
  • 常用鏈接

    留言簿(9)

    隨筆分類(68)

    隨筆檔案(80)

    文章分類(1)

    My Open Source Projects

    搜索

    積分與排名

    最新評(píng)論

    主站蜘蛛池模板: 国产大片51精品免费观看| 欧洲乱码伦视频免费国产| 成人免费无毒在线观看网站| 亚洲高清毛片一区二区| 在线观看亚洲成人| 国产精品亚洲精品日韩电影| 亚洲中文字幕无码久久综合网| 美美女高清毛片视频黄的一免费 | 免费一区二区无码东京热| 亚洲精品网站在线观看你懂的| 91在线免费观看| 亚洲免费福利在线视频| 中文字幕久久亚洲一区| 亚洲第一成年免费网站| 热久久这里是精品6免费观看| 久久久青草青青国产亚洲免观 | 黄色片在线免费观看| 一级片在线免费看| 亚洲一级毛片免观看| 亚洲国产精品免费观看| wwwxxx亚洲| 亚洲va无码va在线va天堂| 久久久久久AV无码免费网站| 亚洲AV永久无码精品网站在线观看 | 又粗又硬又黄又爽的免费视频 | 四虎影院免费视频| 久久国产免费一区二区三区 | 国产免费私拍一区二区三区| 亚洲精品欧美综合四区| 亚洲中文字幕无码久久2017 | 国产无人区码卡二卡三卡免费| 亚洲黄色一级毛片| 免费无遮挡无码永久在线观看视频| 亚洲av中文无码字幕色不卡| 亚洲国产第一站精品蜜芽| 日韩高清免费在线观看| 最近最新高清免费中文字幕 | 亚洲精品国产高清在线观看| 成人免费视频试看120秒| 国产午夜精品免费一区二区三区| 亚洲AV人无码激艳猛片|