Java学习day084 部署Java程序(一)(JAR文件:创建JAR文件、清单文件、可执行JAR文件、资源、密封)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。

day084   部署Java程序(一)(JAR文件:创建JAR文件、清单文件、可执行JAR文件、资源、密封)

准备创建提交给用户的应用程序,需要知道如何将这些应用程序进行打包,以便部署到用户的计算机上。传统的部署方式是使用applet,这应该归功于在Java出现的最初几年中对其给予的大肆吹捧。applet是一种特殊的Java程序,它允许通过网络下载,并可以在浏览器中运行。其目的在于让用户不再为安装软件烦恼,并且可以通过支持Java的计算机或者其他具有Internet连接的设备使用这些软件。由于种种原因,applet并没有实现上述目标。


JAR 文件

在将应用程序进行打包时,使用者一定希望仅提供给其一个单独的文件,而不是一个含有大量类文件的目录,Java归档(JAR)文件就是为此目的而设计的。一个JAR文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件。此外,JAR文件是压缩的,它使用了大家熟悉的ZIP压缩格式。


1.创建JAR文件

可以使用jar工具制作JAR文件(在默认的JDK安装中,位于jdk/bin目录下)。创建一个新的JAR文件应该使用的常见命令格式为:jar cvf JARFileName File1 File2 . . .

通常,jar命令的格式如下:jar options File1 File2...

下表列出了所有 jar 程序的可选项。它们类似于 UNIX tar 命令的选项。

可以将应用程序、程序组件以及代码库打包在JAR文件中。例如,JDK的运行时库包含在一个非常庞大的文件rt.jar中。


2.清单文件

除了类文件、图像和其他资源外,每个JAR文件还包含一个用于描述归档特征的清单文件(manifest)。

清单文件被命名为MANIFEST.MF,它位于JAR文件的一个特殊META-INF子目录中。最小的符合标准的清单文件是很简单的:Manifest-Version:1.0

复杂的清单文件可能包含更多条目。这些清单条目被分成多个节。第一节被称为主节(main section)。它作用于整个JAR文件。随后的条目用来指定已命名条目的属性,这些已命名的条目可以是某个文件、包或者URL。它们都必须起始于名为Name的条目。节与节之间用空行分开。例如:

Manifest-Version:1.0

描述这个归档文件的行

要想编辑清单文件,需要将希望添加到清单文件中的行放到文本文件中,然后运行:

jarcfmJARFileNameManifestFileName...

例如,要创建一个包含清单的JAR文件,应该运行:

jarcfmMyArchive.jarmanifest.mfcom/mycompany/mypkg/*.class

要想更新一个已有的JAR文件的清单,则需要将增加的部分放置到一个文本文件中,然后执行下列命令:

jarufinMyArchive.jarmanifest-additions.mf


3.可执行JAR文件

可以使用jar命令中的e选项指定程序的人口点,即通常需要在调用java程序加载器时指定的类:

jar cvfe MyProgram.jar com.myconipany.mypkg.MainAppClass files to add

或者,可以在清单中指定应用程序的主类,包括以下形式的语句:

Main-C1ass:com.mycompany.mypkg.MainAppClass

不要将扩展名.class添加到主类名中。清单文件的最后一行必须以换行符结束。否则,清单文件将无法被正确地读取。常见的错误是创建了一个只包含Main-Class而没有行结束符的文本文件。

不论哪一种方法,用户可以简单地通过下面命令来启动应用程序:

java-jarMyProgram.jar

根据操作系统的配置,用户甚至可以通过双击JAR文件图标来启动应用程序。下面是各种操作系统的操作方式:

•在Windows平台中,Java运行时安装器将建立一个扩展名为jar的文件与javaw-jar命令相关联来启动文件(与java命令不同,javaw命令不打开shell窗口)。

•在Solaris平台中,操作系统能够识别JAR文件的“魔法数”格式,并用java-jar命令启动它。

•在Mac OS X平台中,操作系统能够识别.jar扩展名文件。当双击JAR文件时就会执行Java程序可以运行。

无论怎样,人们对JAR文件中的Java程序与本地文件有着不同的感觉。在Windows平台中,可以使用第三方的包装器工具将JAR文件转换成Windows可执行文件。包装器是一个大家熟知的扩展名为.exe的Windows程序,它可以查找和加载Java虚拟机(JVM),或者在没有找到JVM时告诉用户应该做些什么。

在Macintosh平台中,这种情形处理起来会容易一些。JarBundler工具是XCode的一部分,可以将JAR文件转换为一个一流的Mac应用。


4.资源

在applet和应用程序中使用的类通常需要使用一些相关的数据文件,例如:

•图像和声音文件。

•带有消息字符串和按钮标签的文本文件。

•二进制数据文件,例如,描述地图布局的文件。

在Java中,这些关联的文件被称为资源(resource)。

例如,AboutPanel类显示了一条信息,如图所示。当然,在面板中的书名和版权年限将会在出版下一版图书时发生变化。为了易于追踪这个变化,希望将文本放置在一个文件中,而不是以字符串的形式硬写到代码中。

但是应该将about.txt这样的文件放在哪儿呢?显然,将它与其他程序文件一起放在JAR文件中是最方便的。类加载器知道如何搜索类文件,直到在类路径、存档文件或web服务器上找到为止。利用资源机制,对于非类文件也可以同样方便地进行操作。下面是必要的步骤:

1)获得具有资源的Class对象,例如,AboutPanel.class。

2)如果资源是一个图像或声音文件,那么就需要调用getresource(filename)获得作为URL的资源位置,然后利用getlmage或getAudioClip方法进行读取。

3)与图像或声音文件不同,其他资源可以使用getResourceAsStream方法读取文件中的数据。重点在于类加载器可以记住如何定位类,然后在同一位置査找关联的资源。

文件的自动装载是利用资源加载特性完成的。没有标准的方法来解释资源文件的内容。每个程序必须拥有解释资源文件的方法。另一个经常使用资源的地方是程序的国际化。与语言相关的字符串,如消息和用户界面标签都存放在资源文件中,每种语言对应一个文件。

下面这个程序演示了资源加载。编译、创建JAR文件和执行这个程序的命令是:

javac resource/ResourceTest.java

jar cvfm ResourceTest.jar resource/ResourceTest.mf resource/*.class resource/*.gif resource/*.txt

java-jar ResourceTest.jar

将JAR文件移到另外一个不同的目录中,再运行它,以便确认程序是从JAR文件中而不是从当前目录中读取的资源。

/**
 *@author  zzehao
 */
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

public class ResourceTest
{
	public static void main(String[] args)
	{
		EventQueue.invokeLater(() -> {
			JFrame frame = new ResourceTestFrame();
			frame.setTitle("RecourceTest");
			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");
		Image img = new ImageIcon(aboutURL).getImage();
		setIconImage(img);

		JTextArea textArea = new 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);
		}
	}
}

                jar包就是这样了   

                  


5.密封

可以将 Java包密封 (seal ) 以保证不会有其他的类加人到其中。

如果在代码中使用了包可见的类、方法和域,就可能希望密封包。如果不密封,其他类就有可能放在这个包中,进而访问包可见的特性。

例如,如果密封了com.mycompany.util包,就不能用下面的语句顶替密封包之外的类:

packagecom.mycompany.util;

要想密封一个包,需要将包中的所有类放到一个JAR文件中。在默认情况下,JAR文件中的包是没有密封的。可以在清单文件的主节中加人下面一行:

Sealed:true

来改变全局的默认设定。对于每个单独的包,可以通过在JAR文件的清单中增加一节,来指定是否想要密封这个包。例如:

Name:com/mycoinpany/util/

Sealed:true

Name:com/myconpany/misc/

Sealed:false

要想密封一个包,需要创建一个包含清单指令的文本文件。然后用常规的方式运行jar命令:

jar cvfm MyArchive.jar manifest.mf files to add


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值