通过前面章节的学习,相信我们已经基本掌握Swing框架的用法了,这篇笔记我们学习有关Swing图形界面软件开发的最后一个步骤,软件打包和分发。
将Java应用程序打包为可执行Jar是最普遍的软件分发形式,这一部分我们其实在第一章节就已经介绍过了,我们这里回顾一下。
在Eclipse IDE中,我们在工程上点击右键,选择Export...
选项,然后在弹出的对话框中选择Java -> Runnable JAR file
,可以看到如下的导出选项。
在Launch Configuration中我们选择可执行Jar的主类,这里就是我们的com.gacfox.demo.Main
类,下面的Export Destination字段我们填写导出的位置,配置完成后点击Finish按钮,IDE会自动编译和构建程序,并生成可执行Jar文件。
我们可以直接将这个可执行Jar文件分发给用户,只要用户安装有版本合适的Java运行时,它就可以直接双击运行该程序了。
Java Web Start(简称JWS)是由Sun Microsystems推出的一项Java程序分发技术,它使得Java应用程序能够通过浏览器轻松启动和运行。下面我们以一个例子的形式介绍Java Web Start程序的部署和使用。
具体使用Java Web Start前,我们需要先确认作为客户端的操作系统已经正确安装Java环境,且浏览器的Java插件处于启用状态。具体来说,对于Internet Explorer浏览器,Java插件应该在ActiveX加载项中开启;对于Firefox浏览器,我们可以查看是否启用了对应的NPAPI插件。下图中,我们可以看到Internet Explorer 6浏览器中处于启动状态的Java插件。
Java Web Start程序通常还需要进行Jar签名,不签名的Jar可能在JVM沙箱环境中有较多的权限限制,这些限制的目的是确保应用程序只能在受控、有限的环境下运行,防止未经授权的系统访问或潜在的安全漏洞,如果想要突破这些限制就需要对Jar进行签名,并取得用户的授权。不过我们个人通常无法获得正式的证书进行签名,因此这里使用一个自签名证书进行演示。下面两条命令分别用于生成自签名证书和对Jar签名,其中keytool
和jarsigner
都是JDK内置的工具。
下面命令执行后会要求我们输入证书口令和个人信息,执行完成后生成证书文件mykeystore.jks
。
keytool -genkeypair -v -keystore mykeystore.jks -keyalg RSA -keysize 2048 -validity 3650 -alias mykey
下面命令执行后,对demo.jar
签名,生成签名后的signed-demo.jar
文件。
jarsigner -keystore mykeystore.jks -signedjar signed-demo.jar demo.jar mykey
注:使用Java Web Start时,我们的工程可以不导出为可执行Jar,导出为普通Jar即可,这是因为程序的入口类是在下面的JNLP描述文件中指定的(当然,导出为可执行Jar也没有影响)。
JNLP描述文件用于描述Java Web Start程序,下面是一个例子。
demo.jnlp
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://127.0.0.1:8080/demo/">
<information>
<title>Todo</title>
<vendor>Yuina</vendor>
<description>My first Java Web Start APP</description>
<homepage href="http://127.0.0.1:8080"/>
</information>
<resources>
<jar href="signed-demo.jar" main="true"/>
</resources>
<application-desc main-class="com.gacfox.demo.Main"/>
</jnlp>
JNLP描述文件是XML格式的,这些描述文件指定了Jar文件的URL,即http://127.0.0.1:8080/demo/signed-demo.jar
,此外还指定了程序的主类com.gacfox.demo.Main
。
我们可以使用任何支持静态资源分发的Web服务器部署Java Web Start程序,我这里使用最新版本的Apache Tomcat 6,注意部署Java Web Start和JavaEE没有任何关系,我们这里仅仅是用Tomcat来分发静态资源,不涉及任何Servlet或EJB的内容。
我们在Tomcat的webapps
目录下新建文件夹demo
,然后将demo.jnlp
和signed-demo.jar
放在demo
文件夹中。
apache-tomcat-6.0.18
|_ webapps
|_ demo
|_ demo.jnlp
|_ signed-demo.jar
使用浏览器访问http://localhost:8080/demo/demo.jnlp
,即可打开我们部署的Java Web Start程序了。
实际开发中,我们可以将JNLP的URL嵌入在某个Web页面的超级链接中,这样用户点击链接,即可迅速打开我们的Java应用程序!
Java Applet是一种在网页中嵌入动态内容的Java小程序,它通过浏览器插件在客户端执行。Applet小程序和前面介绍的Java Web Start是不同的,Applet直接通过HTML标签嵌入浏览器页面中。Applet可用于提供JavaScript无法比拟的复杂交互或动态内容展示,如大型游戏、动画或企业级的复杂图表等内容。著名的MMORPG游戏《RuneScape》就是基于Applet技术实现的,下面我们介绍如何将Swing程序以Applet形式部署。
和Java Web Start类似,我们需要先确认作为客户端的操作系统已经正确安装Java环境,且浏览器的Java插件处于启用状态。
Applet程序没有JForm
主窗体的概念了,取而代之的是JApplet
,它其实也是一个“GUI界面”,但它是嵌入浏览器页面中的。下面例子代码我们把之前的Todo
程序改为了Applet实现。
MainApplet.java
package com.gacfox.demo;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class MainApplet extends JApplet {
private SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
private DefaultTableModel todoTableModel = new DefaultTableModel(
new String[][] {}, new String[] { "Content", "Create Time" });
public MainApplet() {
JTable tTodo = new JTable(todoTableModel);
JScrollPane spTodo = new JScrollPane(tTodo);
add(spTodo);
JPanel pInput = new JPanel();
final JTextField tfTodo = new JTextField(20);
JButton btnSubmit = new JButton("Submit");
btnSubmit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text = tfTodo.getText();
String time = format.format(new Date());
todoTableModel.addRow(new String[] { text, time });
}
});
pInput.add(tfTodo);
pInput.add(btnSubmit);
add(pInput, BorderLayout.SOUTH);
}
}
编写完Java代码后,我们使用Eclipse导出一个普通Jar文件即可。和Java Web Start的JNLP类似,Applet程序的主类是在<applet>
标签中指定的,因此我们可以不必导出可执行Jar。此外我们还要了解,Applet小程序也是默认运行在JVM沙箱中的,出于安全考虑,它有着诸多的限制,例如限制对本地文件系统的访问、限制对系统资源的访问、HTTP跨域限制等。如果想要突破这些限制,就需要对Jar签名并取得用户的同意。对Jar签名的步骤和之前类似,这里就不赘述了。
我们这里创建一个标准的Web页面,但其中使用了<applet>
标签。
index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Todo程序</title>
</head>
<body>
<h1>欢迎使用我的小程序 :)</h1>
<applet code="com/gacfox/demo/MainApplet.class" archive="demo.jar" width="350" height="200">
</applet>
</body>
</html>
<applet>
标签中,code
属性指定入口Applet
类在Jar文件中的文件路径,archieve
指定了Jar文件的URL,width
和height
指定了浏览器页面中Applet小程序的宽和高。
我们将编写好的主页和Jar文件放置在Tomcat的某个目录下即可,和之前Java Web Start一样,我们这里仅仅是用Tomcat来分发静态资源。
apache-tomcat-6.0.18
|_ webapps
|_ demo
|_ demo.jar
|_ index.html
使用浏览器访问http://localhost:8080/demo/index.html
,即可打开我们部署的包含Applet的Web主页。
可以看到,炫酷的应用程序已经显示在我们的Web页面上了!