-
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)單了");
}
}

最終項(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)題

-
創(chuàng)建
keystore, 命名為swing-demo-keys, alias 為 jdckeytool -genkey -keystore swing-demo-keys -alias jdc運(yùn)行之后輸入兩次密碼, 后面的名字, 組織之類(lèi)的輸入不輸入無(wú)所謂了.
-
將創(chuàng)建的
keystore添加到swing-demo.jarjarsigner -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)到就行.

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)下圖配置吧.

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

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

問(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是最直接的處理方式.
-
瀏覽器通過(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)行.
-
系統(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)行方式的.) java web start加載.jnlp文件, 從中獲取可執(zhí)行jar包的下載地址,執(zhí)行方法,以及參數(shù)等信息, 然后去下載jar包后執(zhí)行應(yīng)用程序.