49、Java 应用程序打包与部署全解析

Java 应用程序打包与部署全解析

1. JAR 文件操作选项

JAR 文件在 Java 开发中十分重要,在操作 JAR 文件时,有一些实用的选项:
| 选项 | 描述 |
| — | — |
| signedjar | 可以为要签名的 JAR 文件指定另一个名称。若不指定,执行命令的 JAR 文件将被覆盖。例如,若想同时保留 chess.jar 的签名和未签名副本,可使用 chess_secure.jar 作为签名后的文件名。 |
| verify | 用于验证 JAR 文件是否正确签名。 |
| verbose | 让 jarsigner 工具在签名过程中输出更多信息,有助于调试问题。 |
| certs | 应与 verbose verify 一起使用,它将显示 JAR 文件每个签名者的证书信息。 |
| tsa | 允许指定时间戳权威机构的位置。 |

2. JAR 索引选项

下载小程序所需的 JAR 文件可能缓慢且痛苦,在 JAR 文件中线性搜索所需类会导致性能低下、带宽浪费以及启动下载缺失 JAR 文件的等待时间过长。而 JARIndex 算法可将小程序中的所有 JAR 文件存储到一个索引文件中,显著加快类加载时间。

jar 工具的 -i 选项用于生成 JAR 文件内类、包和资源的索引信息,使访问时间更快。这些信息存储在 META - INF 目录下的 INDEX.LIST 小文本文件中。

当类加载器访问 JAR 文件时,会将 INDEX.LIST 文件读入一个哈希映射,其中包含所有文件和包名。这样,类加载器无需在 JAR 文件中线性搜索所需的类文件或资源,而是查询哈希映射,从而加快访问速度。

INDEX.LIST 文件始终受类加载器信任,手动操作它不明智。若操作失误导致类加载器无法定位资源或文件,会抛出 InvalidJarIndexException ,方便捕获并纠正错误。

生成 chess.jar 的索引可使用以下命令:

C:\>jar -iv chess.jar

查看 chess.jar 内容:

C:\>jar -tf chess.jar
META-INF/INDEX.LIST
META-INF/
META-INF/MANIFEST.MF
chess/
chess/Chess.java
chess/ChessGUI.java
chess/images/
chess/images/board.bmp

INDEX.LIST 文件内容如下:

JarIndex-Version: 1.0
chess.jar
chess
chess/images

该文件只是文本,且在 JAR 文件中被压缩,内存占用极小。

3. 创建可执行 JAR 文件

Java 支持将 JAR 文件设置为可执行。可执行 JAR 文件可在控制台或命令提示符中通过以下命令运行:

java –jar jar-file-name

在 Windows 中,若应用程序是 GUI 驱动的,只需双击可执行 JAR 文件即可自动运行。

创建可执行 JAR 文件的步骤如下:
1. 编译所有 Java 源代码。
2. 创建一个清单文件,至少包含 Manifest-Version Main-Class 属性。 Main-Class 应指向 JAR 文件中包含 main 方法的类名,示例如下:

Manifest-Version: 1.0
Main-Class: Test
  1. 使用以下语法创建 JAR 文件:
jar –cmf myManifest.mf test.jar *
  1. 使用 -jar 选项执行 JAR 文件:
java –jar test.jar

若在清单文件中指定了包含应用程序 main 方法的正确类,创建的 test.jar 应能正常执行。对于 GUI 驱动的应用程序,使 JAR 文件自执行非常有用。

4. Java 小程序分析

Java 小程序是 Java 编程语言的显著特性之一。小程序是为在支持 Java 的 Web 浏览器中运行而设计的程序,可直接嵌入 HTML 中,用于处理用户输入或显示信息,如当前天气预报。小程序也可独立于 Web 浏览器存在,具备类似独立应用程序的强大功能。

不过,制作功能丰富的小程序存在一个缺点,即小程序越大,用户下载和使用所需的时间就越长,因为每次用户访问包含小程序的网页时都会下载小程序。但随着 Java 插件缓存能力的不断提升,这个问题逐渐得到缓解。

4.1 小程序的基本结构

小程序没有标准 Java 应用程序所需的 main 方法,只需继承 Applet 类。小程序的方法是事件驱动的,开发基本小程序时,有五个基本的事件驱动方法很有用: init start stop destroy paint 。示例代码如下:

import javax.swing.*;
import java.awt.*;

public class Welcome extends JApplet {
    public void init() {
        System.out.println("Initializing Applet");
        repaint();
    }

    public void start() {
        System.out.println("Starting Applet");
        repaint();
    }

    public void paint(Graphics g) {
        g.drawString("Welcome to Java Applets!", 100, 50);
    }

    public void stop() {
        System.out.println("Stopping Applet");
        repaint();
    }

    public void destroy() {
        System.out.println("Destroying Applet");
        repaint();
    }
}

这五个方法的描述如下:
| 方法 | 描述 |
| — | — |
| init | 用于在小程序首次加载或重新加载时进行初始化。 |
| start | 小程序初始化后调用,可在此启动线程或开始执行代码。 |
| stop | 用户离开包含小程序的网页或退出浏览器时调用,可用于清理代码,如线程或正在执行的代码。 |
| destroy | 小程序卸载前进行最终清理的最后机会。 |
| paint | 当 GUI 需要根据用户与小程序的交互进行更新时调用。 |
实现基本小程序不一定要重写所有这些事件方法,例如,仅重写 paint 方法显示 “Hello World!” 字符串,小程序也能正常工作。此外,还有许多其他事件方法可重写以响应用户操作,如重写 mouseDown 方法捕获鼠标按下事件。在更高级的小程序实现中,通常会使用 Swing 来构建小程序。

4.2 小程序打包执行

小程序的执行方式与普通 Java 应用程序不同,通常嵌入 HTML 页面,由兼容 Java 的浏览器(如 Internet Explorer)执行,Internet Explorer 使用 Java 插件执行小程序代码。开发时,也可使用 appletviewer 命令执行嵌入在 HTML 文件中的小程序,例如:

appletviewer com/wrox/Welcome.html

HTML 代码示例如下:

<HTML>
<HEAD>
<TITLE> Welcome to Java Applet </TITLE>
</HEAD>
<BODY>
<APPLET CODE="Welcome.class" CODEBASE="com/wrox/" WIDTH=200 HEIGHT=50>
<PARAM NAME="exampleParam" VALUE="whatever">
</APPLET>
</BODY>
</HTML>

<APPLET> </APPLET> 标签指定要执行的小程序, CODE 属性引用包含编译后小程序类的类名, CODEBASE 属性可选,指定小程序类的存储基目录,若不使用该属性,HTML 文件所在目录将作为基目录。 <PARAM> </PARAM> 标签可指定加载小程序时要传递的特定参数,这些标签有 NAME VALUE 两个属性,可在小程序的 init 方法中通过 getParameter 方法获取参数值,示例如下:

public void init() {
    String sValue = getParameter("exampleParam");
    if (sValue != null) {
        System.out.println(sValue);         
    }
}
4.3 小程序安全问题

创建和部署小程序时,Java 环境会对小程序实施一定的安全限制。通常,小程序不能与除下载源主机之外的其他机器建立网络连接,一般也被限制从客户端机器读写文件,且不能启动客户端机器上的应用程序。

未被信任的小程序不能读写文件,所有下载的小程序默认被视为不可信,除非另有指定。要使小程序可信,必须由身份数据库中标记为可信的身份进行签名。通常,Web 浏览器会询问用户是否信任小程序来源的服务器,这有助于赋予小程序更多访问计算机的权限。在本地机器上开发小程序时,由于从本地机器访问,通常被视为可信,可能看不到远程用户下载小程序时遇到的安全限制。因此,在部署小程序前,了解用户的操作权限很重要,可参考 Java 文档获取更多小程序安全细节。

5. 探索 Web 应用程序

Web 应用程序可作为 Web ARchive 文件(即 WAR 文件)部署在应用服务器上。WAR 文件格式与 JAR 文件相同,开发者使用 jar 工具创建 WAR 文件,但 WAR 文件的目录结构和包含的文件与标准 JAR 文件不同。

WAR 文件通常包含 JSP、Servlet、HTML、图像、音频文件、XML 文件等,静态和动态内容构成了 WAR 文件。WAR 文件主要用于两个基本目的:一是面向前端展示,注重用户体验;二是采用服务导向方法,为调用它的其他应用程序提供服务,这种类型的 Web 应用程序通常称为 Web 服务。

在大型架构中,Web 服务可能使用简单对象访问协议(SOAP)进行通信。若在 SOAP 层之上添加安全性,打包和部署系统会变得复杂,因为需要管理证书、密钥库、签名 JAR 文件、SSL 等安全相关组件和协议。不过,在最简单的形式下,WAR 文件易于使用,是打包和压缩包含静态和动态数据(如表单处理或购物车)的网站资源的理想选择,WAR 文件格式使整个网站具有可移植性,便于部署在其他兼容 J2EE 的应用服务器上。

6. WAR 目录结构

WAR 文件与 JAR 文件的区别在于其目录结构和文件组成。以下是一个部署在 Tomcat 上的 Web 应用程序示例:

images
forum
    file.png
    Category.class
    Driver.class
    Post.class
    Topic.class
    folders.png
    index.jsp
    newcategory.jsp
    newpost.jsp
    newtopic.jsp
    post.jsp
    topic.jsp
WEB-INF
    web.xml
    web-app_2_3.dtd
    cglib-2.0-rc2.jar
    commons-collections-2.1.jar
    commons-logging-1.0.3.jar
    dom4j-1.4.jar
    classes
    libs

在根级别,包含用户界面组件所需的所有 JSP 文件, images 目录存储 JSP 使用的图像。 WEB-INF 目录是区分 WAR 文件和 JAR 文件的重要目录,其中的 web.xml 文件是必需的,正式名称为 Web 应用程序部署描述符。 classes 目录用于存储 JSP 或 Servlet 可使用的编译类, libs 目录包含使 Web 应用程序正常工作所需的所有 JAR 文件。

7. WAR 部署描述符

Web 应用程序部署描述符用于配置 Web 应用程序,以 web.xml 为例,它包含以下可配置的基本 XML 元素,且必须按以下顺序出现:
| 元素 | 描述 |
| — | — |
| icon | 有两个子元素,分别代表 GUI 工具的小图标和大图标。 |
| display - name | 包含一个简短名称,供工具使用,不要求唯一。 |
| description | 用于向父元素描述信息,在多个不同元素中使用。 |
| distributable | 存在该元素表示 Web 应用程序被编程为可在 Servlet 容器中分布式运行。 |
| context - param | 用于初始化 Web 应用程序的 Servlet 上下文。 |
| filter | 专门用于为 Web 应用程序映射 Servlet 或 URL 模式。 |
| filter - mapping | 容器使用该元素决定将请求映射到哪些过滤器。 |
| listener | 该元素及其子元素用于声明 Web 应用程序监听器 Bean,只需指定监听器 Bean 的类。 |
| servlet | 该元素及其子元素用于指定特定类或 JSP 为 Servlet,并为该 Servlet 提供特定配置。 |
| servlet - mapping | 定义 Servlet 与特定 URL 模式之间的映射。 |
| session - config | 用于配置 Web 应用程序的会话信息。 |
| mime - mapping | 允许将文件扩展名与 MIME 类型进行映射。 |
| welcome - file - list | 确定用户访问 Web 应用程序时显示的第一页。 |
| error - page | 当发生错误时,该元素中的映射允许将错误代码映射到错误页面。 |
| taglib | 用于描述 JSP 标签库。 |
| resource - ref | 允许指定 Web 应用程序中使用的外部资源。 |
| security - constraint | 允许将安全约束与特定资源关联。 |
| login - config | 用于指定 Web 应用程序使用的身份验证方法以及任何身份验证约束。 |
| security - role | 允许为 Web 应用程序定义安全角色。 |
| env - entry | 用于指定 Web 应用程序中的类、JSP 等可以获取的环境条目。 |

以下是一个 Tomcat 的 web.xml 示例文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
" http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>HelloWAR</display-name>
<description> HelloWAR </description>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<! — Creating mime type mappings -->
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>htm</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>gif</extension>
<mime-type>image/gif</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpg</extension>
<mime-type>image/jpeg</mime-type>
</mime-mapping>
</web-app>

<servlet> 元素用于指定 Web 应用程序中存在的 Servlet 信息,如这里的 HelloServlet <load - on - startup> 属性表示应用服务器应在启动时加载该 Servlet。

总结

本文详细介绍了 Java 开发中 JAR 文件、小程序、WAR 文件的相关操作和特性,包括 JAR 文件的操作选项、索引生成,小程序的结构、打包执行和安全问题,以及 WAR 文件的目录结构和部署描述符。掌握这些知识,有助于开发者更好地进行 Java 应用程序的打包和部署。

Java 应用程序打包与部署全解析

8. 操作流程总结

为了更清晰地展示上述各类 Java 应用程序相关操作的流程,下面通过 mermaid 流程图和列表进行总结。

8.1 创建可执行 JAR 文件流程
graph LR
    A[编译所有 Java 源代码] --> B[创建清单文件]
    B --> C[添加 Manifest-Version 和 Main-Class 属性]
    C --> D[使用 jar 命令创建 JAR 文件]
    D --> E[使用 -jar 选项执行 JAR 文件]

具体步骤如下:
1. 编译 Java 源代码,确保所有代码无误。
2. 创建清单文件,文件内容至少包含 Manifest-Version Main-Class 属性,示例:

Manifest-Version: 1.0
Main-Class: Test
  1. 使用命令 jar –cmf myManifest.mf test.jar * 创建 JAR 文件。
  2. 使用 java –jar test.jar 命令执行 JAR 文件。
8.2 小程序执行流程
graph LR
    A[编写小程序代码] --> B[嵌入 HTML 文件]
    B --> C[使用 appletviewer 或浏览器执行]
    C --> D[传递参数(可选)]
    D --> E[小程序运行]

具体步骤如下:
1. 编写小程序代码,例如:

import javax.swing.*;
import java.awt.*;

public class Welcome extends JApplet {
    public void init() {
        System.out.println("Initializing Applet");
        repaint();
    }

    public void start() {
        System.out.println("Starting Applet");
        repaint();
    }

    public void paint(Graphics g) {
        g.drawString("Welcome to Java Applets!", 100, 50);
    }

    public void stop() {
        System.out.println("Stopping Applet");
        repaint();
    }

    public void destroy() {
        System.out.println("Destroying Applet");
        repaint();
    }
}
  1. 将小程序嵌入 HTML 文件,示例:
<HTML>
<HEAD>
<TITLE> Welcome to Java Applet </TITLE>
</HEAD>
<BODY>
<APPLET CODE="Welcome.class" CODEBASE="com/wrox/" WIDTH=200 HEIGHT=50>
<PARAM NAME="exampleParam" VALUE="whatever">
</APPLET>
</BODY>
</HTML>
  1. 使用 appletviewer com/wrox/Welcome.html 命令或在支持 Java 的浏览器中打开 HTML 文件执行小程序。
  2. 若有参数传递,可在 HTML 文件中使用 <PARAM> 标签,在小程序的 init 方法中使用 getParameter 方法获取参数值。
9. 不同类型文件对比

为了更好地区分 JAR 文件、小程序和 WAR 文件,下面通过表格进行对比。
| 文件类型 | 特点 | 用途 | 操作注意事项 |
| — | — | — | — |
| JAR 文件 | 用于打包 Java 类、资源等,可进行签名、索引等操作 | 作为 Java 应用程序的基本打包单元,方便代码复用和分发 | 签名时可指定文件名,生成索引可加快类加载速度 |
| 小程序 | 可嵌入 HTML 页面,在支持 Java 的浏览器中运行,方法为事件驱动 | 处理用户输入、显示信息等 | 注意安全限制,部署前确保用户权限 |
| WAR 文件 | 格式与 JAR 文件相同,但目录结构和文件组成不同,包含静态和动态内容 | 部署 Web 应用程序,可面向前端展示或提供 Web 服务 | 注意目录结构和部署描述符的配置 |

10. 常见问题及解决方法

在 Java 应用程序打包和部署过程中,可能会遇到一些常见问题,下面列举并给出解决方法。
| 问题 | 可能原因 | 解决方法 |
| — | — | — |
| 可执行 JAR 文件无法运行 | 清单文件中 Main-Class 属性指定错误;类路径问题 | 检查清单文件,确保 Main-Class 指向包含 main 方法的类;检查类路径是否正确 |
| 小程序无法显示 | 小程序代码有错误;HTML 文件中 CODE CODEBASE 属性指定错误 | 检查小程序代码,确保无语法错误;检查 HTML 文件中相关属性是否正确 |
| WAR 文件部署失败 | 目录结构不符合要求;部署描述符配置错误 | 检查 WAR 文件的目录结构,确保包含必要的文件和目录;检查部署描述符,确保 XML 元素配置正确 |

11. 最佳实践建议

为了更高效地进行 Java 应用程序的打包和部署,以下是一些最佳实践建议。
1. JAR 文件方面
- 定期对 JAR 文件进行签名,确保文件的完整性和安全性。
- 对于大型项目,合理使用 JAR 索引,提高类加载速度。
2. 小程序方面
- 尽量减少小程序的大小,以减少用户下载时间。
- 在开发过程中,充分测试小程序的安全性能,确保在不同环境下都能正常运行。
3. WAR 文件方面
- 严格按照规范配置部署描述符,避免因配置错误导致部署失败。
- 对 WAR 文件进行版本管理,方便后续的维护和更新。

总结

通过本文的详细介绍,我们全面了解了 Java 开发中 JAR 文件、小程序和 WAR 文件的相关知识,包括它们的操作选项、结构特点、部署流程以及安全问题等。同时,通过操作流程总结、不同类型文件对比、常见问题解决方法和最佳实践建议,为开发者提供了更清晰的指导。在实际开发中,开发者应根据具体需求选择合适的文件类型,并严格按照操作规范进行打包和部署,以确保 Java 应用程序的顺利运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值