//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中的程序,可以正常使用本地功能。
(责任编辑:包春林)