編寫:桂靜秋
參考:http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/contents.html
前言
項目需要,所以前幾天研究了一下,折騰了我1.5天的時間,不能浪費,特此寫出來share大家。
應用
JWS主要應用在發布應用程式上,主要寫好了jnlp檔案,使用者通過http訪問到,應用程式會自動安裝在本地機器,今後升級等工作JWS將自動完成。可以說是發布軟體的一種新方式。(當然,前提對方必須有jvm)
實施步驟
編寫好一個測試檔案,並且打成hello.jar包
-
- //File HelloJNLP.java
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- import java.net.*;
-
- public class HelloJNLP extends JFrame implements ActionListener {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public HelloJNLP() {
- super("Hello JNLP");
- String loadedFrom = this.getClass().getClassLoader().toString();
- JLabel jl = new JLabel("loaded by " + loadedFrom);
- JEditorPane jtp = new JEditorPane("text/plain", "版本1.1.2");
- JButton bb = new JButton("write native file");
- getContentPane().add(jl, BorderLayout.NORTH);
- getContentPane().add(jtp, BorderLayout.CENTER);
- getContentPane().add(bb, BorderLayout.SOUTH);
- bb.addActionListener(this);
- bb.setActionCommand("wnf");
- }
-
- public static void main(String[] args) {
- JFrame f = new HelloJNLP();
- f.setBounds(100, 100, 325, 250);
- f.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
- f.setVisible(true);
- f.addWindowListener(new WindowAdapter() {
- public void windowClosed(WindowEvent e) {
- System.out.println("Shutting down...");
- System.exit(0);
- }
- });
- }
-
- public void actionPerformed(ActionEvent arg0) {
- //System.out.println(arg0.getActionCommand());
- try {
- FileOutputStream fos = new FileOutputStream("abcfile");
- try {
- fos.write(0xffff);
- fos.close();
- System.out.println("write file ok");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
-
- try {
- Socket sock = new Socket(InetAddress.getByName("www.cctv.com"), 80);
- sock.close();
- System.out.println("socket create ok");
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- }
- }
-
此應用在點JButton 的時候測試寫本地檔案系統和使用本網資源。(編譯和打包過程省略)
接著,也是我折騰了一天的事情,如何把此jar進行認證認證,使得此應用安裝到使用者那可以操作本地資源。原來我使用jdk的keytool工具產生認證,但是只可用半年,後來考慮去官方申請一個,居然要800$/年。最後考慮用openssl自己做,但是過程相當複雜,而且沒法很好的控制流程程,主要是對openssl命令不太熟悉用途。折騰了一天,終於發現原來java自己就可以產生使用限期自訂的證實。哎...
產生一個新的keystore
keytool -genkey -keystore myKeystore -alias myself
產生一個私認證
keytool -selfcert -alias myself -keystore myKeystore -validity 365
注意-validity 365為認證使用到期日,為1年,可以自己定義更大。
對jar進行簽名
jarsigner -keystore myKeystore hello.jar myself
這樣簽名工作就完成了。最後寫個jnlp描述檔案hello.jnlp
-
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- file Hello.jnlp -->
- <jnlp codebase="http://192.168.1.6:81/jnlp/"
- href="http://192.168.1.6:81/jnlp/hello.jnlp">
- <information>
- <title>Hello</title>
- <vendor>Tech Tips Sample May 2001</vendor>
- <icon href="/jnlp/qq.jpg"/>
- </information>
- <resources>
- <j2se version="1.3+"/>
- <jar href="/jnlp/hello.jar"/>
- </resources>
- <security>
- <all-permissions>
- </security>
- <application-desc main-class="HelloJNLP"/>
- </jnlp>
-
我這裡把jar和jnlp都放在192.168.1.6的主機上面,並且通過81port進行訪問。你可以更加自己的需要修改上面的相關資訊。
測試一下。http://192.168.1.6:81/jnlp/hello.jnlp用ie開啟,馬上會彈出一個你是否接受的筐,並且說明這個個人或者公司是不可信的(就因為不是權威機構申請的認證,哎),點接受後就可以正常運行jar中的程式,可以正常使用本地功能。
同樣,applet經過上面步驟也可以操作本地,就好比經過簽名的activeX一樣,也好比一部分ie自己認為已經簽名的activeX一樣(其實就是系統漏洞,呵呵),請大家批評指正。