软件打包和分发

通过前面章节的学习,相信我们已经基本掌握Swing框架的用法了,这篇笔记我们学习有关Swing图形界面软件开发的最后一个步骤,软件打包和分发。

可执行Jar

将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

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插件。

创建自签名证书并对Jar签名

Java Web Start程序通常还需要进行Jar签名,不签名的Jar可能在JVM沙箱环境中有较多的权限限制,这些限制的目的是确保应用程序只能在受控、有限的环境下运行,防止未经授权的系统访问或潜在的安全漏洞,如果想要突破这些限制就需要对Jar进行签名,并取得用户的授权。不过我们个人通常无法获得正式的证书进行签名,因此这里使用一个自签名证书进行演示。下面两条命令分别用于生成自签名证书和对Jar签名,其中keytooljarsigner都是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描述文件

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服务器部署程序

我们可以使用任何支持静态资源分发的Web服务器部署Java Web Start程序,我这里使用最新版本的Apache Tomcat 6,注意部署Java Web Start和JavaEE没有任何关系,我们这里仅仅是用Tomcat来分发静态资源,不涉及任何Servlet或EJB的内容。

我们在Tomcat的webapps目录下新建文件夹demo,然后将demo.jnlpsigned-demo.jar放在demo文件夹中。

apache-tomcat-6.0.18
    |_ webapps
        |_ demo
            |_ demo.jnlp
            |_ signed-demo.jar

访问Java Web Start程序

使用浏览器访问http://localhost:8080/demo/demo.jnlp,即可打开我们部署的Java Web Start程序了。

实际开发中,我们可以将JNLP的URL嵌入在某个Web页面的超级链接中,这样用户点击链接,即可迅速打开我们的Java应用程序!

Applet 网页小程序

Java Applet是一种在网页中嵌入动态内容的Java小程序,它通过浏览器插件在客户端执行。Applet小程序和前面介绍的Java Web Start是不同的,Applet直接通过HTML标签嵌入浏览器页面中。Applet可用于提供JavaScript无法比拟的复杂交互或动态内容展示,如大型游戏、动画或企业级的复杂图表等内容。著名的MMORPG游戏《RuneScape》就是基于Applet技术实现的,下面我们介绍如何将Swing程序以Applet形式部署。

和Java Web Start类似,我们需要先确认作为客户端的操作系统已经正确安装Java环境,且浏览器的Java插件处于启用状态。

编写Applet程序

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页面

我们这里创建一个标准的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,widthheight指定了浏览器页面中Applet小程序的宽和高。

在Web服务器部署程序

我们将编写好的主页和Jar文件放置在Tomcat的某个目录下即可,和之前Java Web Start一样,我们这里仅仅是用Tomcat来分发静态资源。

apache-tomcat-6.0.18
    |_ webapps
        |_ demo
            |_ demo.jar
            |_ index.html

访问包含Applet的Web页面

使用浏览器访问http://localhost:8080/demo/index.html,即可打开我们部署的包含Applet的Web主页。

可以看到,炫酷的应用程序已经显示在我们的Web页面上了!

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap