jnlp 項(xiàng)目示例

  • jnlp項(xiàng)目示例
    • 1-創(chuàng)建一個(gè)可執(zhí)行jar
    • 2-為jar添加簽名
    • 3-編寫(xiě) jnlp 文件
    • 4-發(fā)布前三步的文件到服務(wù)器
    • 5-測(cè)試執(zhí)行
  • 問(wèn)題
    • 瀏覽器輸入U(xiǎn)rl只下載不執(zhí)行 & 雙擊.jnlp 文件不執(zhí)行

簡(jiǎn)介

JNLP(Java Network Launch Protocol)是一種用來(lái)在網(wǎng)絡(luò)中部署應(yīng)用程序的一種協(xié)議;

在客戶端只需要安裝 java web start 就可以使用服務(wù)器端的軟件,它具有自動(dòng)更新應(yīng)用程序版本的功能;

通過(guò) java web start 加載.jnlp文件, 從中獲取可執(zhí)行jar包的下載地址,執(zhí)行方法,以及參數(shù)等信息, 然后去下載jar包后執(zhí)行應(yīng)用程序.

優(yōu)點(diǎn): 如果你的java應(yīng)用程序以jnlp 的方式發(fā)布,如果版本升級(jí)后,不需要再向所有用戶發(fā)布版本,只需要更新服務(wù)器的版本,這就相當(dāng)于讓java應(yīng)用程序有了web應(yīng)用的優(yōu)了
Jnlp還是一種基于xml的啟動(dòng)java程序的技術(shù)。在100town.com您可以將生成的代碼存成一個(gè)后綴為**.jnlp的文件,將這個(gè)文件發(fā)布在自己的網(wǎng)站上,當(dāng)用戶訪問(wèn)這個(gè)網(wǎng)站時(shí),就可以啟動(dòng)java程序。

jnlp項(xiàng)目示例

1. 創(chuàng)建一個(gè)可執(zhí)行jar

隨便創(chuàng)建一個(gè)里面有main()方法的jar就行了, 為了演示完整點(diǎn), 來(lái)個(gè)簡(jiǎn)單的frame demo

package cn.cpf;

import javax.swing.*;
import java.awt.*;

/**
* @author by CPF
*/
public class MainFrame extends JFrame {
   private static final long serialVersionUID = -4791222140191948495L;

   /**
   * Launch the application.
   */
   public static void main(String[] args) {
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            try {
               MainFrame frame = new MainFrame();
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }

   /**
   * Create the frame.
   */
   public MainFrame() {
      setBounds(100, 100, 325, 203);

      final JPanel contentPane = new JPanel();
      contentPane.setLayout(null);
      setContentPane(contentPane);

      final JTextField textField = new JTextField();
      textField.setBounds(10, 20, 200, 30);
      contentPane.add(textField);
      textField.setColumns(50);
      textField.setText("簡(jiǎn)單的frame, 非常簡(jiǎn)單了");
   }
}
swing-demo-structure.png

最終項(xiàng)目結(jié)構(gòu)是這樣的, 然后達(dá)成 swing-demo.jar 包, 能不能點(diǎn)擊執(zhí)行無(wú)所謂的.

2. 為jar添加簽名

沒(méi)有簽名實(shí)際上也是可以運(yùn)行的, 只不過(guò)在運(yùn)行的時(shí)候會(huì)彈出一些警告, 而且在調(diào)用本地資源時(shí)可能會(huì)出現(xiàn)問(wèn)題

cmd-storekey.png
  1. 創(chuàng)建 keystore, 命名為 swing-demo-keys, alias 為 jdc

    keytool -genkey -keystore swing-demo-keys -alias jdc

    運(yùn)行之后輸入兩次密碼, 后面的名字, 組織之類(lèi)的輸入不輸入無(wú)所謂了.

  2. 將創(chuàng)建的 keystore 添加到 swing-demo.jar

    jarsigner -keystore swing-demo-keys swing-demo.jar jdc

3. 編寫(xiě) jnlp 文件

具體的配置屬性請(qǐng)看下面的文件示例, 里面的注釋解釋的很詳細(xì)

編寫(xiě) jnlp 文件命名為 swing-demo.jnlp

<?xml version="1.0" encoding="UTF-8"?>

<!--codebase 屬性指出搜索應(yīng)用程序資源的頂級(jí)URL,下面的icon/jar元素都是以這個(gè)URL為基本, 當(dāng)然你也可以使用完整的url路徑.-->
<!--codebase 據(jù)說(shuō)直接填本地文件夾路徑都可以, 具體我也沒(méi)有試過(guò), 有興趣的話可以嘗試下.-->
<jnlp codebase="http://127.0.0.1:8080/jnlptest" href="./swing-demo.jnlp">
    <!--    blog.bitsCN.com網(wǎng)管博客等你來(lái)搏-->
    <information>
        <!-- 在"開(kāi)始"-"運(yùn)行"菜單中輸入"javaws"或"javaws -viewer"啟動(dòng)Web Start,會(huì)看到客戶端已經(jīng)安裝的webstart應(yīng)用程序-->
        <!--title :應(yīng)用程序標(biāo)題 vendor:供應(yīng)商, title/vendor 元素必須,會(huì)顯示在用"javaws -viewer"命令, 打開(kāi)的應(yīng)用程序緩存查看器(Java Application Cache Viewer)中-->
        <title>HelloWorld</title>
        <vendor>哈哈哈哈</vendor>
        <description>demo</description>

        <!-- homepage :存放有關(guān)應(yīng)用程序的相關(guān)文檔的URL,如help文件等,僅僅是description作用
        <homepage /> -->

        <!--icon 指定圖標(biāo)會(huì)顯示在應(yīng)用程序緩存查看器中,在查看器中新建webstart快捷方式到桌面時(shí)也會(huì)顯示為快捷方式圖標(biāo),只支持GIF/JPEG格式,其它格式無(wú)效-->
        <icon href="./img/logo.jpg"/>

        <!--splash 在sun的文檔中提到會(huì)出現(xiàn)在webstart啟動(dòng)時(shí)的閃屏中,如果網(wǎng)絡(luò)慢, 或啟動(dòng)慢, 可以設(shè)置一下了-->
        <icon kind="splash" href="./logo.jpg"/>

        <!-- 允許離線啟動(dòng),可以使用javaws -offline命令-->
        <offline-allowed/>
    </information>

    <resources>
        <!-- 最好1.5以上, 下面我指定的是1.8, 因?yàn)槲矣X(jué)得1.8以前的版本都過(guò)時(shí)了, 哈哈 -->
        <j2se version="1.8+"/>
        <!-- 指定要下載到本地的jar文件(注意,所有的文件都需要打包才能夠下載),可以包含一些資源文件,如icons/configuration files,可以使用getResource方法取得-->
        <jar href="./swing-demo.jar"/>
    </resources>

    <!--application-desc 必須,指定webstart啟動(dòng)時(shí)執(zhí)行jar文件中的哪個(gè)類(lèi)-->
    <application-desc main-class="cn.cpf.MainFrame"/>

</jnlp>

4. 發(fā)布前三步的文件到服務(wù)器

再此使用tomcat(其他serve-app也可以), 在tomcat的webapp目錄下新建 jnlptest 文件夾, 將swing-demo.jnlp, swing-demo.jar, swing-demo-key 等全部拷貝進(jìn)去. 如果在.jnlp文件中配置logo, 或者其它jar包的話也全部放進(jìn)去. 啟動(dòng)tomcat, 反正只要通過(guò)url路徑能訪問(wèn)到就行.

file-structure.png

5. 測(cè)試執(zhí)行

瀏覽器輸入http://127.0.0.1:8080/jnlptest/swing-demo.jnlp, 回車(chē),

或者命令行輸入 javaws http://127.0.0.1:8080/jnlptest/swing-demo.jnlp


注意此時(shí)可能會(huì)彈出安全, 權(quán)限什么的, 如果這是個(gè)值得信任的.jnlp文件的話就去java控制面板里面去配置信息, 詳情見(jiàn)下圖配置吧.

jnlp-javaws-config.png

即便配置完成之后也會(huì)有下面的警告

jnlp-warning.png

還有就是如果url對(duì)應(yīng)的jar沒(méi)有簽名的話, 也會(huì)彈出各種彈框啦, 至于信不信任自己視情況而定.

最后畫(huà)面就顯示出來(lái)了

mainframe-demo.png

問(wèn)題

瀏覽器輸入U(xiǎn)rl只下載不執(zhí)行 & 雙擊.jnlp 文件不執(zhí)行

首先先說(shuō)明一個(gè)大眾都誤解的一個(gè)錯(cuò)誤, 瀏覽器是不能打開(kāi)jnlp文件的, 真正打開(kāi)jnlp的是javaws(java web start), 完整的步驟是瀏覽器發(fā)現(xiàn)自己不能處理jnlp文件, 于是將jnlp拋給系統(tǒng)去處理, 系統(tǒng)自己也不能處理, 最后由系統(tǒng)去調(diào)用javaws執(zhí)行jnlp文件. 詳細(xì)步驟如下

直接在命令行輸入 javaws http://127.0.0.1:8080/jnlptest/swing-demo.jnlp 是最直接的處理方式.

  1. 瀏覽器通過(guò)url訪問(wèn)的一般是一個(gè) .jnlp 文件, 瀏覽器獲得文件之后發(fā)現(xiàn)自己不能處理 .jnlp 文件, 之后不同的瀏覽器會(huì)有不同的處理方式.

    • ie: 默認(rèn)直接交給系統(tǒng)去運(yùn)行.
    • chrome: 默認(rèn)直接下載.
    • Mocrosoft Egde: 彈出一個(gè)選項(xiàng)(運(yùn)行, 下載, 取消), 運(yùn)行就是交給系統(tǒng)去運(yùn)行.
  2. 系統(tǒng)獲得 .jnlp 文件之后會(huì)交給java web start運(yùn)行.

    如果系統(tǒng)無(wú)法識(shí)別.jnlp文件打開(kāi)方式的話, 可以通過(guò)配置.jnlp文件默認(rèn)打開(kāi)程序來(lái)解決.(一般來(lái)說(shuō)只要是通過(guò)window安裝包正確安裝jre的話, 都會(huì)自動(dòng)配置.jnlp文件運(yùn)行方式的.)

  3. java web start 加載.jnlp文件, 從中獲取可執(zhí)行jar包的下載地址,執(zhí)行方法,以及參數(shù)等信息, 然后去下載jar包后執(zhí)行應(yīng)用程序.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容