Java 中文官方教程 2022 版(十三)(3)https://developer.aliyun.com/article/1486366
例如,TicTacToe JAR 文件的详细输出将类似于以下内容:
68 Thu Nov 01 20:00:40 PDT 2012 META-INF/MANIFEST.MF 553 Mon Sep 24 21:57:48 PDT 2012 TicTacToe.class 3708 Mon Sep 24 21:57:48 PDT 2012 TicTacToe.class 9584 Mon Sep 24 21:57:48 PDT 2012 TicTacToe.java 0 Mon Sep 24 21:57:48 PDT 2012 audio/ 4032 Mon Sep 24 21:57:48 PDT 2012 audio/beep.au 2566 Mon Sep 24 21:57:48 PDT 2012 audio/ding.au 6558 Mon Sep 24 21:57:48 PDT 2012 audio/return.au 7834 Mon Sep 24 21:57:48 PDT 2012 audio/yahoo1.au 7463 Mon Sep 24 21:57:48 PDT 2012 audio/yahoo2.au 424 Mon Sep 24 21:57:48 PDT 2012 example1.html 0 Mon Sep 24 21:57:48 PDT 2012 images/ 157 Mon Sep 24 21:57:48 PDT 2012 images/cross.gif 158 Mon Sep 24 21:57:48 PDT 2012 images/not.gif
提取 JAR 文件内容
原文:
docs.oracle.com/javase/tutorial/deployment/jar/unpack.html
用于提取 JAR 文件内容的基本命令是:
jar xf *jar-file [archived-file(s)]*
让我们看看这个命令中的选项和参数:
x
选项表示您要从 JAR 存档中提取文件。f
选项表示要从命令行指定的 JAR 文件中提取文件,而不是通过 stdin。jar-file
参数是要从中提取文件的 JAR 文件的文件名(或路径和文件名)。archived-file(s)
是一个可选参数,由一个以空格分隔的文件列表组成,用于从存档中提取文件。如果没有此参数,Jar 工具将提取存档中的所有文件。
通常情况下,命令中x
和f
选项的顺序无关紧要,但它们之间不能有空格。
在提取文件时,Jar 工具会复制所需文件并将其写入当前目录,复制文件在存档中的目录结构。原始 JAR 文件保持不变。
注意: 当提取文件时,Jar 工具将覆盖与提取文件具有相同路径名的任何现有文件。
一个示例
让我们从之前部分中使用的 TicTacToe JAR 文件中提取一些文件。回想一下,TicTacToe.jar
的内容是:
META-INF/MANIFEST.MF TicTacToe.class TicTacToe.class TicTacToe.java audio/ audio/beep.au audio/ding.au audio/return.au audio/yahoo1.au audio/yahoo2.au example1.html images/ images/cross.gif images/not.gif
假设您想要提取TicTacToe
类文件和cross.gif
图像文件。为此,您可以使用以下命令:
jar xf TicTacToe.jar TicTacToe.class images/cross.gif
这个命令做了两件事:
- 它在当前目录中放置了
TicTacToe.class
的副本。 - 如果
images
目录不存在,它会创建该目录,并在其中放置cross.gif
的副本。
原始 TicTacToe JAR 文件保持不变。
可以以相同的方式从 JAR 文件中提取任意数量的文件。当命令没有指定要提取哪些文件时,Jar 工具将提取存档中的所有文件。例如,您可以使用以下命令提取 TicTacToe 存档中的所有文件:
jar xf TicTacToe.jar
更新 JAR 文件
原文:
docs.oracle.com/javase/tutorial/deployment/jar/update.html
Jar 工具提供了一个u
选项,您可以使用该选项通过修改清单或添加文件来更新现有 JAR 文件的内容。
添加文件的基本命令格式如下:
jar uf *jar-file input-file(s)*
在此命令中:
u
选项表示您要更新现有的 JAR 文件。f
选项表示要更新的 JAR 文件在命令行上指定。jar-file
是要更新的现有 JAR 文件。input-file(s)
是一个用空格分隔的一个或多个要添加到 JAR 文件中的文件列表。
任何已经存在于归档中且与要添加的文件具有相同路径名的文件将被覆盖。
创建新的 JAR 文件时,您可以选择使用-C
选项来指示目录更改。有关更多信息,请参阅创建 JAR 文件部分。
示例
请记住,TicTacToe.jar
包含以下内容:
META-INF/MANIFEST.MF TicTacToe.class TicTacToe.class TicTacToe.java audio/ audio/beep.au audio/ding.au audio/return.au audio/yahoo1.au audio/yahoo2.au example1.html images/ images/cross.gif images/not.gif
假设你想要将文件images/new.gif
添加到 JAR 文件中。你可以通过在images
目录的父目录中发出以下命令来实现:
jar uf TicTacToe.jar images/new.gif
修改后的 JAR 文件将具有以下目录:
META-INF/MANIFEST.MF TicTacToe.class TicTacToe.class TicTacToe.java audio/ audio/beep.au audio/ding.au audio/return.au audio/yahoo1.au audio/yahoo2.au example1.html images/ images/cross.gif images/not.gif images/new.gif
您可以在执行命令期间使用-C
选项来“更改目录”。例如:
jar uf TicTacToe.jar -C images new.gif
此命令将在将new.gif
添加到 JAR 文件之前切换到images
目录。当new.gif
添加到归档中时,images
目录不会包含在new.gif
的路径名中,导致目录如下所示:
META-INF/MANIFEST.MF META-INF/MANIFEST.MF TicTacToe.class TicTacToe.class TicTacToe.java audio/ audio/beep.au audio/ding.au audio/return.au audio/yahoo1.au audio/yahoo2.au example1.html images/ images/cross.gif images/not.gif new.gif
运行 JAR 打包的软件
现在您已经学会了如何创建 JAR 文件,那么您如何实际运行您打包的代码呢?考虑以下情况:
- 您的 JAR 文件包含一个应该在浏览器中运行的小程序。
- 您的 JAR 文件包含一个应该从命令行启动的应用程序。
- 您的 JAR 文件包含您想要用作扩展的代码。
本节将涵盖前两种情况。教程中关于扩展机制的单独路径涵盖了 JAR 文件作为扩展的使用。
打包在 JAR 文件中的小程序
要从 HTML 文件中启动任何小程序以在浏览器中运行,您可以使用applet
标签。欲了解更多信息,请参阅 Java 小程序课程。如果小程序被打包为 JAR 文件,您唯一需要做的不同之处就是使用archive参数来指定 JAR 文件的相对路径。
作为示例,使用 TicTacToe 演示小程序。在显示小程序的 HTML 文件中,applet
标签可以标记如下:
<applet code=TicTacToe.class width="120" height="120"> </applet>
如果 TicTacToe 演示被打包在名为TicTacToe.jar
的 JAR 文件中,您可以通过添加一个archive
参数修改applet
标签:
<applet code=TicTacToe.class archive="TicTacToe.jar" width="120" height="120"> </applet>
archive
参数指定包含TicTacToe.class
的 JAR 文件的相对路径。在此示例中,假定 JAR 文件和 HTML 文件在同一目录中。如果它们不在同一目录中,您必须在archive
参数的值中包含 JAR 文件的相对路径。例如,如果 JAR 文件在 HTML 文件的下一个目录中,名为applets
的目录中,那么applet
标签将如下所示:
<applet code=TicTacToe.class archive="applets/TicTacToe.jar" width="120" height="120"> </applet>
JAR 文件作为应用程序
您可以使用 Java 启动器(java
命令)运行 JAR 打包的应用程序。基本命令如下:
java -jar *jar-file*
-jar
标志告诉启动器应用程序以 JAR 文件格式打包。您只能指定一个 JAR 文件,其中必须包含所有特定于应用程序的代码。
在执行此命令之前,请确保运行时环境已经了解 JAR 文件中哪个类是应用程序的入口点。
要指示哪个类是应用程序的入口点,您必须向 JAR 文件的清单中添加一个Main-Class
头部。该头部的格式如下:
Main-Class: *classname*
头部的数值,classname
,是应用程序的入口类的名称。
欲了解更多信息,请参阅设置应用程序的入口点部分。
当在清单文件中设置了Main-Class
时,您可以从命令行运行应用程序:
java -jar app.jar
要从位于另一个目录中的 JAR 文件运行应用程序,您必须指定该目录的路径:java -jar path/app.jar
与清单文件一起工作:基础知识
原文:
docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
JAR 文件支持广泛的功能,包括电子签名、版本控制、包封装等。是什么赋予了 JAR 文件这种多功能性?答案就是 JAR 文件的清单。
清单是一个特殊的文件,可以包含关于打包在 JAR 文件中的文件的信息。通过调整清单包含的这些“元”信息,您可以使 JAR 文件具有各种用途。
本课程将解释清单文件的内容,并向您展示如何使用它,包括基本功能的示例:
理解默认清单
创建 JAR 文件时,会自动创建一个默认清单。本节描述了默认清单。
修改清单文件
本节向您展示了修改清单文件的基本方法。后续章节演示了您可能想要进行的具体修改。
设置应用程序的入口点
本节描述了如何在清单文件中使用Main-Class
头来设置应用程序的入口点。
将类添加到 JAR 文件的类路径
本节描述了如何在清单文件中使用Class-Path
头来在运行小程序或应用程序时将其他 JAR 文件中的类添加到类路径中。
设置包版本信息
本节描述了如何在清单文件中使用包版本头。
在 JAR 文件中封装包
本节描述了如何通过修改清单文件在 JAR 文件中封装包。
使用清单属性增强安全性
本节描述了如何使用清单属性来增加小程序或 Java Web 启动应用程序的安全性。
附加信息
清单格式的规范是在线 JDK 文档的一部分。
理解默认清单
原文:
docs.oracle.com/javase/tutorial/deployment/jar/defman.html
当您创建一个 JAR 文件时,它会自动获得一个默认清单文件。存档中只能有一个清单文件,并且它始终具有路径名
META-INF/MANIFEST.MF
当您创建一个 JAR 文件时,默认清单文件只包含以下内容:
Manifest-Version: 1.0 Created-By: 1.7.0_06 (Oracle Corporation)
这些行显示清单条目采用“头部: 值”对的形式。头部的名称与其值之间用冒号分隔。默认清单符合清单规范的 1.0 版本,并由 JDK 的 1.7.0_06 版本创建。
清单还可以包含有关打包在存档中的其他文件的信息。清单中应记录哪些文件信息取决于您打算如何使用 JAR 文件。默认清单不假设应记录有关其他文件的哪些信息。
信息摘要不包含在默认清单中。要了解有关摘要和签名的更多信息,请参阅签署和验证 JAR 文件课程。
修改清单文件
原文:
docs.oracle.com/javase/tutorial/deployment/jar/modman.html
你可以使用 m
命令行选项在创建 JAR 文件时向清单中添加自定义信息。本节描述了 m
选项。
Jar 工具会自动将一个默认清单放入你创建的任何 JAR 文件中,路径名为 META-INF/MANIFEST.MF
。你可以通过修改默认清单来启用特殊的 JAR 文件功能,比如包封装。通常,修改默认清单涉及向清单中添加特定用途的头部,使得 JAR 文件能够执行特定的功能。
要修改清单,你必须首先准备一个包含你希望添加到清单中的信息的文本文件。然后,你可以使用 Jar 工具的 m
选项将文件中的信息添加到清单中。
警告: 用于创建清单的文本文件必须以新行或回车符结束。如果最后一行没有以新行或回车符结束,最后一行将无法正确解析。
基本命令格式如下:
jar cfm *jar-file manifest-addition input-file(s)*
让我们看看这个命令中使用的选项和参数:
c
选项表示你想要创建一个 JAR 文件。m
选项表示你想要将现有文件中的信息合并到你正在创建的 JAR 文件的清单文件中。f
选项表示你希望输出到一个文件(即你正在创建的 JAR 文件),而不是标准输出。manifest-addition
是现有文本文件的名称(或路径和名称),其内容你希望添加到 JAR 文件清单的内容中。jar-file
是你希望生成的 JAR 文件的名称。input-file(s)
参数是一个用空格分隔的一个或多个文件列表,你希望将这些文件放入你的 JAR 文件中。
m
和 f
选项必须按照相应参数的顺序排列。
注意: 清单的内容必须使用 UTF-8 编码。
本课程的其余部分演示了你可能想要对清单文件进行的具体修改。
设置应用程序的入口点
原文:
docs.oracle.com/javase/tutorial/deployment/jar/appman.html
如果你有一个打包在 JAR 文件中的应用程序,你需要一种方式来指示 JAR 文件中哪个类是你的应用程序的入口点。你可以通过清单中的Main-Class
头部提供这些信息,其一般形式为:
Main-Class: *classname*
值*classname
*是你的应用程序的入口点类的名称。
请记住,入口点是一个具有签名为public static void main(String[] args)
的方法的类。
在清单中设置了Main-Class
头部后,你可以使用以下形式的java
命令运行 JAR 文件:
java -jar *JAR-name*
在Main-Class
头部指定的类的main
方法将被执行。
一个示例
当我们运行 JAR 文件时,我们希望在包MyPackage
中的类MyClass
中执行main
方法。
我们首先创建一个名为Manifest.txt
的文本文件,内容如下:
Main-Class: MyPackage.MyClass
警告: 文本文件必须以换行符或回车符结尾。如果最后一行没有以换行符或回车符结尾,它将无法正确解析。
然后我们通过输入以下命令创建一个名为MyJar.jar
的 JAR 文件:
jar cfm MyJar.jar Manifest.txt MyPackage/*.class
这将创建带有以下内容的清单的 JAR 文件:
Manifest-Version: 1.0 Created-By: 1.7.0_06 (Oracle Corporation) Main-Class: MyPackage.MyClass
当你使用以下命令运行 JAR 文件时,MyClass
的main
方法将被执行:
java -jar MyJar.jar
使用 JAR 工具设置入口点
‘e’标志(代表’entrypoint’)创建或覆盖清单中的Main-Class
属性。它可用于创建或更新 JAR 文件。使用它来指定应用程序的入口点,而无需编辑或创建清单文件。
例如,这个命令创建了app.jar
,其中清单中的Main-Class
属性值设置为MyApp
:
jar cfe app.jar MyApp MyApp.class
你可以通过运行以下命令直接调用这个应用程序:
java -jar app.jar
如果入口类名在一个包中,它可能使用’.'(点)字符作为分隔符。例如,如果Main.class
在一个名为foo
的包中,入口点可以用以下方式指定:
jar cfe Main.jar foo.Main foo/Main.class
将类添加到 JAR 文件的类路径中
原文:
docs.oracle.com/javase/tutorial/deployment/jar/downman.html
你可能需要在一个 JAR 文件中引用其他 JAR 文件中的类。
举例来说,在一个典型的情况下,一个小程序被打包在一个 JAR 文件中,其清单引用了另一个 JAR 文件(或者几个不同的 JAR 文件),这些文件作为该小程序的工具。
你可以在小程序或应用程序的清单文件中的Class-Path
头部字段中指定要包含的类。Class-Path
头部的形式如下:
Class-Path: *jar1-name jar2-name directory-name/jar3-name*
通过在清单中使用Class-Path
头部,你可以避免在调用 Java 运行应用程序时需要指定长长的-classpath
标志。
注意: Class-Path
头部指向本地网络上的类或 JAR 文件,而不是 JAR 文件中的 JAR 文件或通过互联网协议可访问的类。要将 JAR 文件中的类加载到类路径中,你必须编写自定义代码来加载这些类。例如,如果MyJar.jar
包含另一个名为MyUtils.jar
的 JAR 文件,你不能使用MyJar.jar
清单中的Class-Path
头部来将MyUtils.jar
中的类加载到类路径中。
一个例子
我们希望将MyUtils.jar
中的类加载到类路径中,以便在MyJar.jar
中使用。这两个 JAR 文件在同一个目录中。
我们首先创建一个名为Manifest.txt
的文本文件,内容如下:
Class-Path: MyUtils.jar
警告: 文本文件必须以一个新行或回车符结束。如果最后一行没有以新行或回车符结束,它将无法被正确解析。
然后我们通过输入以下命令创建一个名为MyJar.jar
的 JAR 文件:
jar cfm MyJar.jar Manifest.txt MyPackage/*.class
这将创建一个带有以下内容的清单的 JAR 文件:
Manifest-Version: 1.0 Class-Path: MyUtils.jar Created-By: 1.7.0_06 (Oracle Corporation)
当你运行MyJar.jar
时,MyUtils.jar
中的类现在已经加载到类路径中。