一.理论知识部分
JAR文件
Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar文件后,GUI界面程序就可以直接双击图标运行。
.jar文件(Java归档)既可以包含类文件,也可以包含诸如图像和声音这些其它类型的文件。
JAR文件是压缩的,它使用ZIP压缩格式。
jar命令
jar命令格式:
jar{ctxui}[vfm0Me][jar-file][manifest-file][entry-point][-Cdir]files...
Jar命令选项:
–-c创建一个新的或者空的存档文件并加入文件。
–-C暂时改变到指定的目录
–-e在清单文件中创建一个条目
–-f将JAR文件名指定为第二个命令行参数
–-i为指定的JAR文件产生索引信息
–-m将一个清单文件(manifest)添加到JAR文件中
–-M不产生所有项的清单文件(manifest)
–-t列出存档内容的列表
–-u更新已存在的JAR文件
–-v生成详细的输出结果
–-x解压存档中的命名的(或所有的〕文件
–-0只存储方式,不用ZIP压缩格式
(1)创建JAR文件
jarcfjar-fileinput-file(s)
c-wanttoCreateaJARfile.
eg:1)jarcfMenuTest.jar*.class*.gif
f-wanttheoutputtogotoafileratherthantostdout.
2)jarcvfMenuTest.jar*.class*.gif
v-Producesverboseoutputtostdout.
3)jarcvfMenuTest.jar*
*-createallcontentsincurrentdirectory.
4)jarcv0fMenuTest.jar*
0-don'twanttheJARfiletobecompressed.
(2)查看JAR文件
jartfjar-file
t-wanttoviewtheTableofcontentsoftheJARfile.
eg:1)jartvfMenuTest.jar
v-Producesverboseoutputtostdout.
(3)提取JAR文件
jarxfjar-file[archived-file(s)]
x-wanttoextractfilesfromtheJARarchive.
eg:1)jarxfMenuTest.jarcopy.gif(仅提取文件copy.gif)
2)jarxfMenuTest.jaralex/copy.gif(仅提取目录alex下的文件copy.gif)
3)jarxfMenuTest.jar(提取该JAR中的所有文件或目录)
(4)更新JAR文件
jarufjar-fileinput-file(s)
u-wanttoupdateanexistingJARfile.
eg:1)jarufMenuTest.jarcopy.gif
(5)索引JAR文件
jarijar-file
i-indexanexistingJARfile.
eg:1)jariMenuTest.jar
清单文件
每个JAR文件中包含一个用于描述归档特征的清单文件(manifest)。清单文件被命名MANIFEST.MF,它位于JAR文件的一个特殊的META-INF子目录中。
最小的符合标准的清单文件是很简单的:
Manifest-Version:1.0
复杂的清单文件包含多个条目,这些条目被分成多个节。第一节被称为主节,作用于整个JAR文件。随后的条目用来指定已命名条目的属性,可以是文件、包或者URL。
清单文件的节与节之间用空行分开,最后一行必须以换行符结束。否则,清单文件将无法被正确地读取。
创建一个包含清单的JAR文件,应该运行:
jarcfmMyArchive.jarmanifest.mfcom/*.class
–要更新一个已有JAR文件的清单,则需要将增加的部分放置到一个文本文件中,运行如下命令:
jarufmMyArchive.jarmanifest-additions.mf
运行JAR文件
用户可以通过下面的命令来启动应用程序:
java–jarMyProgram.jar
窗口操作系统,可通过双击JAR文件图标来启动应用程序。
资源
Java中,应用程序使用的类通常需要一些相关的数据文件,这些文件称为资源(Resource)。
–图像和声音文件。
–带有消息字符串和按钮标签的文本文件。
–二进制数据文件,如:描述地图布局的文件。
类加载器知道如何搜索类文件,直到在类路径、存档文件或Web服务器上找到为止。
利用资源机制对于非类文件也可以进行同样操作,具体步骤如下:
–获得资源的Class对象。
–如果资源是一个图像或声音文件,那么就需要调用getresource(filename)获得资源的URL位置,然后利用getImage或getAudioClip方法进行读取。
–如果资源是文本或二进制文件,那么就可以使用getResouceAsStream方法读取文件中的数据。
资源文件可以与类文件放在同一个目录中,也可以将资源文件放在其它子目录中。具体有以下两种方式:
–相对资源名:如data/text/about.txt
它会被解释为相对于加载这个资源的类所在的包。
–绝对资源名:如/corejava/title.txt
ResourceTest.java程序演示了资源加载的过程。
编译、创建JAR文件和执行这个程序的命令如下:
–javacResourceTest.java
–jarcvfmResourceTest.jarResourceTest.mf
*.class*.gif*.txt
–java–jarResourceTest.jar
Eclipse导出JAR文件
工程没有引用外部jar包时,直接导出。
当工程引用了其他的外部jar时,由于Eclipse不支持同时导出外部jar包的功能,导出过程比较复杂。(*)
包密封
将Java包密封(Seal)可保证不会有其它的类加入到其中。如果在代码中使用了包可见的类、方法和字段,就可能希望密封包。如果不密封,其它类就有可能放在这个包中,进而访问包可见的特性。
–例如,如果密封了com.mycompany.util包,就不能用下面的语句将密封包之外的类加入包内:
–Packagecom.mycompany.util;
要想密封一个包,需要将包中的所有类放到一个JAR文件。在默认情况下,JAR文件中的包是没有密封的。
JavaWebStart
JavaWebStart是一个用Java编写的应用程序,它是Sun公司推出的一项在Internet发布应用程序的技术;
通过JavaWebStart可以使一个应用程序很容易地通过web部署在各个平台上,包Windows,Linux,Solaris等。
JavaWebStart部署应用程序
JavaWebStart的工作过程是基于JavaNetwork LaunchProtocol(JNLP)协议的。一个后缀为JNLP的文件包含了应用程序的说明以及如何启动这个应用程序的所有信息,JavaWebStart技术部署应用程序的关键就在于JNLP文件的编写以及发布。
二.实验部分
1、实验目的与要求
(1) 掌握Java应用程序的打包操作;
(2) 了解应用程序存储配置信息的两种方法;
(3) 掌握基于JNLP协议的java Web Start应用程序的发布方法;
(5) 掌握Java GUI 编程技术。
2、实验内容和步骤
实验1: 导入第13章示例程序,测试程序并进行代码注释。
测试程序1
l 在elipse IDE中调试运行教材585页程序13-1,结合程序运行结果理解程序;
l 将所生成的JAR文件移到另外一个不同的目录中,再运行该归档文件,以便确认程序是从JAR文件中,而不是从当前目录中读取的资源。
l 掌握创建JAR文件的方法;
代码:
package resource; import java.awt.*; import java.io.*; import java.net.*; import java.util.*; import javax.swing.*; /** * @version 1.41 2015-06-12 * @author Cay Horstmann */ public class ResourceTest { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new ResourceTestFrame(); frame.setTitle("ResourceTest"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } /** * A frame that loads image and text resources. */ class ResourceTestFrame extends JFrame { private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 300; public ResourceTestFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); URL aboutURL = getClass().getResource("about.gif");//返回此 Object 的运行时类。查找带有给定名称的资源 Image img = new ImageIcon(aboutURL).getImage();//根据指定的 URL 创建一个 ImageIcon setIconImage(img);//设置要作为此窗口图标显示的图像 JTextArea textArea = new JTextArea();//JTextArea 是一个显示纯文本的多行区域 InputStream stream = getClass().getResourceAsStream("about.txt"); try (Scanner in = new Scanner(stream, "UTF-8")) { while (in.hasNext()) textArea.append(in.nextLine() + "\n");//将给定文本追加到文档结尾 } add(textArea); } }