Java 中文官方教程 2022 版(十三)(2)https://developer.aliyun.com/article/1486365
附加资源
欲了解更多关于文件关联的信息,请参阅将文件与独立应用程序关联。
欲了解关于 JavaFX Ant 参数的更多信息,请参阅JavaFX Ant 任务参考。
添加外部库
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/addlibrary.html
自包含应用程序包含应用程序运行所需的一切。 如果您的应用程序需要外部库,则可以将该库添加到应用程序的包中。 添加库可以通过不同的方式完成。
使用文件关联中描述的文件关联演示在构建过程中下载 Groovy 库。 该库被放置在项目的/lib
目录中供应用程序使用。 然后,该目录被复制到生成自包含应用程序包的/dist
目录中。
build.xml
文件中-pre-init
任务中的以下代码显示了如何下载库:
<!-- download and copy groovy library --> <copy toFile="lib/groovy-all-2.3.8.jar"> <resources> <url url="http://central.maven.org/maven2/org/codehaus/groovy/groovy-all/2.3.8/groovy-all-2.3.8.jar"/> </resources> </copy>
查看build.xml
以获取完整的构建代码。
你可以从自包含应用示例下载文件关联演示的源文件。
提供默认参数
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/defaultarg.html
当启动应用程序时,参数会传递给 Java 应用程序。自包含应用程序可以设置一个默认参数,当未指定参数时使用。使用元素来定义参数。可以通过为每个参数添加一个
元素来传递多个参数。有关此元素的信息,请参阅fx:argument。
在使用文件关联中描述的文件关联演示设置为使用打包在应用程序中的示例文件之一的名称作为默认参数。
build.xml
文件中任务中的以下代码显示了如何定义默认参数:
<fx:application id="fileassociationdemo" name="File Association Demo" mainClass="${main.class}" version="1.0"> <fx:argument>sample.js</fx:argument> </fx:application>
查看build.xml
以获取完整的构建代码。
您可以从自包含应用程序示例下载文件关联演示的源文件。
其他资源
有关默认参数的更多信息,请参阅向自包含应用程序传递参数。
有关 JavaFX Ant 参数的更多信息,请参阅JavaFX Ant 任务参考。
使用一个通用的构建文件适用于所有平台
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/commonbuild.html
要为应用程序在每个平台上生成一个自包含的应用程序包,必须在每个平台上运行打包工具。您可以选择使用特定于平台的构建文件或设置一个可以在所有平台上运行的构建文件。特定于平台的文件可能更容易设置,但您必须维护多个文件。
使用文件关联中描述的文件关联演示使用一个可以在所有平台上运行的单个构建文件。
构建文件的以下元素支持其在所有平台上的使用:
- 应用程序的主类为
ScriptRunnerApplication.java
,用于 Linux 和 Windows,以及ScriptRunnerApplicationMac.java
,用于 OS X。在-pre-init
任务中的以下代码用于确定使用哪个类:
<condition property="main.class" value="sample.fa.ScriptRunnerApplication" else="sample.fa.ScriptRunnerApplicationMac"> <not><os family="mac"/></not> </condition>
- 在
-pre-init
任务中的以下代码用于防止在 Linux 或 Windows 上运行时编译 OS X 的主类:
<condition property="excludes" value="**/*Mac.java"> <not><os family="mac"/></not> </condition>
元素用于向不同的打包程序传递参数。未被打包程序使用的参数将被忽略,因此构建文件可以包含所有平台所需的参数。以下代码定义了 Linux、OS X 和 Windows 的参数:
<fx:bundleArgument arg="classpath" value="FileAssociationsDemo.jar lib/groovy-all-2.3.8.jar"/> <fx:bundleArgument arg="win.exe.systemWide" value="true"/> <fx:bundleArgument arg="linux.bundleName" value="file-association-demo"/> <fx:bundleArgument arg="email" value="maintainer@example.com"/> <fx:bundleArgument arg="mac.CFBundleName" value="File Assoc Demo"/> <fx:bundleArgument arg="win.menuGroup" value="Java Demos"/>
请查看build.xml
以获取完整的构建代码。
您可以从自包含应用程序示例下载文件关联演示的源文件。
使用多个入口点
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/multiplelaunchers.html
当您有一组相关的应用程序希望用户部署时,自包含应用程序非常有用。自包含应用程序提供一个单独的可安装捆绑包,安装所有应用程序和运行它们所需的 JRE。
多个启动器演示包括转换现有应用程序中描述的动态树演示和使用文件关联中描述的文件关联演示。项目的/src
目录包含两个应用程序的源文件。
您可以从自包含应用程序示例下载多个启动器演示的源文件。
自包含应用程序的主要入口点由元素的
mainClass
属性标识。在多个启动器演示中,主要入口点是文件关联演示。主类为 Linux 和 Windows 的sample.fa.ScriptRunnerAppliation
,或者 OS X 的sample.fa.ScriptRunnerApplicationMac
。有关在跨平台使用单个构建文件时确定要使用的类的信息,请参见为所有平台使用通用构建文件。
每个次要入口点由元素的一个实例标识。有关此元素的信息,请参见fx:secondaryLauncher。
在多个启动器演示中,次要入口点是动态树演示。build.xml
文件中的以下代码显示了如何定义第二个入口点:
<fx:secondaryLauncher name="Dynamic Tree Demo" mainClass="webstartComponentArch.DynamicTreeApplication" version="1.0" title="Dynamic Tree Demo" vendor="My Company" description="A Demo of Multiple Launchers for JavaPackager" copyright="(c) 2014 My Company" menu="true" shortcut="false" > </fx:secondaryLauncher>
请查看build.xml
以获取完整的构建代码。
要为多个启动器演示生成可安装的捆绑包,请参见转换现有应用程序中的“生成捆绑包”部分。
当您安装自包含应用程序时,将安装具有多个启动器入口点的文件关联演示和具有自己入口点的动态树演示。例如,在 Windows 上,开始菜单中的Java Demos
文件夹包含两个条目:动态树演示和多个启动器演示。请注意,为多个启动器入口点设置了文件关联,因此打开 JavaScript 或 Groovy 文件会启动多个启动器。
附加资源
有关多个入口点的更多信息,请参见支持多个入口点。
关于 JavaFX Ant 参数的更多信息,请参阅JavaFX Ant 任务参考。
问题和练习:自包含应用程序
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/QandE/questions.html
问题
- 以下哪一项不是自包含应用程序的优势?
- 用户使用他们熟悉的安装程序安装应用程序。
- 该应用程序作为本机应用程序运行。
- 该应用程序在用户机器上需要更少的空间。
- 您可以控制应用程序使用的 JRE 版本。
- 该应用程序不需要浏览器来运行。
- 真或假:MIME 类型必须始终用于设置文件关联。
- 用于识别
Ant 任务中自包含应用程序的入口点的元素是什么?
练习
- 编写
Ant 任务,为名为“我的示例应用程序”的简单应用程序生成 Windows MSI 捆绑包。应用程序的 JAR 文件位于
dist
目录中,主类为samples.MyApp
,输出文件将写入当前目录。 - 加强上一个练习中的代码,为所有 Windows 安装程序创建捆绑包,并为文本文件定义文件关联。
检查你的答案。
教程:在 JAR 文件中打包程序
原文:
docs.oracle.com/javase/tutorial/deployment/jar/index.html
Java™ 存档(JAR)文件格式使您能够将多个文件打包到单个存档文件中。通常,JAR 文件包含与小程序和应用程序相关的类文件和辅助资源。
JAR 文件格式提供了许多好处:
- 安全性:您可以对 JAR 文件的内容进行数字签名。识别您签名的用户可以选择授予您的软件安全权限,否则软件将无法获得这些权限。
- 减少下载时间:如果您的小程序打包在 JAR 文件中,小程序的类文件和相关资源可以在单个 HTTP 事务中下载到浏览器,而无需为每个文件打开新连接。
- 压缩:JAR 格式允许您压缩文件以实现高效存储。
- 为扩展打包:扩展框架提供了一种方式,您可以通过该方式向 Java 核心平台添加功能,而 JAR 文件格式定义了扩展的打包方式。通过使用 JAR 文件格式,您也可以将您的软件转换为扩展。
- 软件包封装:存储在 JAR 文件中的软件包可以选择性地封装,以便软件包可以强制执行版本一致性。在 JAR 文件中封装软件包意味着该软件包中定义的所有类必须在同一个 JAR 文件中找到。
- 软件包版本控制:JAR 文件可以保存有关其包含的文件的数据,例如供应商和版本信息。
- 可移植性:处理 JAR 文件的机制是 Java 平台核心 API 的标准部分。
本课程分为四个部分:
使用 JAR 文件:基础知识
本节向您展示如何执行基本的 JAR 文件操作,以及如何运行打包在 JAR 文件中的软件。
使用清单文件:基础知识
本节介绍清单文件以及如何自定义它们,以便您可以执行诸如封装软件包和设置应用程序入口点等操作。
签名和验证 JAR 文件
本节向您展示如何对 JAR 文件进行数字签名并验证已签名的 JAR 文件的签名。
使用与 JAR 相关的 API
本节向您介绍了 Java 平台的一些 JAR 处理功能。JAR 文件格式是 Java 平台扩展机制的重要部分。您可以在本教程的 扩展机制 部分了解有关 JAR 文件这一方面的更多信息。
问题和练习:JAR
测试您对 JAR 的了解。
其他参考资料
Java 开发工具包(JDK)的文档包括有关 Jar 工具的信息:
使用 JAR 文件:基础知识
原文:
docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html
JAR 文件使用 ZIP 文件格式打包,因此您可以将它们用于诸如无损数据压缩、存档、解压缩和存档解包等任务。这些任务是 JAR 文件的最常见用途之一,您可以仅使用这些基本功能实现许多 JAR 文件的好处。
即使您想利用 JAR 文件格式提供的高级功能,如电子签名,您也需要首先熟悉基本操作。
要执行 JAR 文件的基本任务,您需要使用作为 Java 开发工具包(JDK)的一部分提供的 Java 存档工具。因为 Java 存档工具是通过使用jar
命令调用的,所以本教程将其称为“Jar 工具”。
作为本节将涵盖的一些主题的概要和预览,以下表格总结了常见的 JAR 文件操作:
常见的 JAR 文件操作
操作 | 命令 |
创建 JAR 文件 | jar cf *jar-file input-file(s)* |
查看 JAR 文件的内容 | jar tf *jar-file* |
提取 JAR 文件的内容 | jar xf *jar-file* |
从 JAR 文件中提取特定文件 | jar xf *jar-file archived-file(s)* |
运行打包为 JAR 文件的应用程序(需要Main-class 清单头) |
java -jar *app.jar* |
调用打包为 JAR 文件的小程序 |
<applet code=*AppletClassName.class* archive="*JarFileName.jar*" width=*width* height=*height*> </applet>
|
本节向您展示如何执行最常见的 JAR 文件操作,并为每个基本功能提供示例:
创建 JAR 文件
本节向您展示如何使用 Jar 工具将文件和目录打包成 JAR 文件。
查看 JAR 文件的内容
您可以显示 JAR 文件的目录以查看其包含的内容,而无需实际解压 JAR 文件。
提取 JAR 文件的内容
您可以使用 Jar 工具来解压缩 JAR 文件。在提取文件时,Jar 工具会复制所需文件并将其写入当前目录,重现文件在存档中的目录结构。
更新 JAR 文件
本节向您展示如何通过修改其清单或添加文件来更新现有 JAR 文件的内容。
运行打包为 JAR 的软件
本节向您展示如何调用和运行打包在 JAR 文件中的小程序和应用程序。
附加参考
JDK 的文档包括 Jar 工具的参考页面:
创建 JAR 文件
原文:
docs.oracle.com/javase/tutorial/deployment/jar/build.html
创建 JAR 文件的基本命令格式为:
jar cf *jar-file input-file(s)*
此命令中使用的选项和参数为:
c
选项表示您要创建一个 JAR 文件。f
选项表示您希望输出到一个文件而不是到stdout
。jar-file
是您希望生成的 JAR 文件的名称。您可以为 JAR 文件使用任何文件名。按照惯例,JAR 文件名应该使用.jar
扩展名,尽管这不是必需的。input-file(s)
参数是一个以空格分隔的一个或多个要包含在 JAR 文件中的文件列表。input-file(s)
参数可以包含通配符*
符号。如果任何"input-files"是目录,则这些目录的内容将递归添加到 JAR 存档中。
c
和f
选项可以以任意顺序出现,但它们之间不能有任何空格。
此命令将生成一个压缩的 JAR 文件并将其放置在当前目录中。该命令还将为 JAR 存档生成一个默认清单文件。
注意:
JAR 文件中的元数据,如条目名称、注释和清单内容,必须以 UTF8 编码。
您可以将任何这些附加选项添加到基本命令的cf
选项中:
jar 命令选项
选项 | 描述 |
v |
在构建 JAR 文件时在stdout 上产生详细输出。详细输出会告诉您每个文件被添加到 JAR 文件时的名称。 |
0 (zero) |
表示您不希望压缩 JAR 文件。 |
M |
表示不应生成默认清单文件。 |
| m
| 用于从现有清单文件中包含清单信息。使用此选项的格式为:
jar cmf *jar-file* *existing-manifest* *input-file(s)*
有关此选项的更多信息,请参阅修改清单文件。
警告: 清单必须以新行或回车符结束。如果最后一行没有以新行或回车符结束,则最后一行将无法正确解析。
|
-C |
在执行命令期间更改目录。请参见下面的示例。 |
注意:
当您创建一个 JAR 文件时,创建时间将被存储在 JAR 文件中。因此,即使 JAR 文件的内容没有更改,当您多次创建 JAR 文件时,生成的文件也不完全相同。在构建环境中使用 JAR 文件时,您应该注意这一点。建议您在清单文件中使用版本信息来控制 JAR 文件的版本,而不是使用创建时间。请参阅设置包版本信息部分。
一个示例
让我们看一个例子。一个简单的 TicTacToe
小程序。你可以通过从Java SE Downloads下载 JDK Demos and Samples 包来查看这个小程序的源代码。这个演示包含有这种结构的类文件、音频文件和图像文件:
TicTacToe 文件夹层次结构
audio
和 images
子目录包含小程序使用的声音文件和 GIF 图像。
当你在线下载整个教程时,你可以从 jar/examples 目录获取所有这些文件。要将这个演示打包成一个名为 TicTacToe.jar
的单个 JAR 文件,你可以在 TicTacToe
目录内运行以下命令:
jar cvf TicTacToe.jar TicTacToe.class audio images
audio
和 images
参数表示目录,因此 Jar 工具将递归地将它们及其内容放入 JAR 文件中。生成的 JAR 文件 TicTacToe.jar
将放置在当前目录中。因为命令使用了 v
选项进行详细输出,当你运行命令时,你会看到类似于以下输出:
adding: TicTacToe.class (in=3825) (out=2222) (deflated 41%) adding: audio/ (in=0) (out=0) (stored 0%) adding: audio/beep.au (in=4032) (out=3572) (deflated 11%) adding: audio/ding.au (in=2566) (out=2055) (deflated 19%) adding: audio/return.au (in=6558) (out=4401) (deflated 32%) adding: audio/yahoo1.au (in=7834) (out=6985) (deflated 10%) adding: audio/yahoo2.au (in=7463) (out=4607) (deflated 38%) adding: images/ (in=0) (out=0) (stored 0%) adding: images/cross.gif (in=157) (out=160) (deflated -1%) adding: images/not.gif (in=158) (out=161) (deflated -1%)
从这个输出中可以看出,JAR 文件 TicTacToe.jar
已经被压缩。Jar 工具默认会压缩文件。你可以通过使用 0
(零)选项关闭压缩功能,使得命令看起来像这样:
jar cvf0 TicTacToe.jar TicTacToe.class audio images
你可能希望避免压缩,例如,为了增加浏览器加载 JAR 文件的速度。未压缩的 JAR 文件通常比压缩文件加载更快,因为加载过程中无需解压文件。然而,存在一个权衡,即较大的未压缩文件可能在网络下载时需要更长的时间。
Jar 工具将接受使用通配符 *
符号的参数。只要在 TicTacToe
目录中没有不需要的文件,你可以使用以下替代命令来构建 JAR 文件:
jar cvf TicTacToe.jar *
尽管详细输出没有显示,Jar 工具会自动向 JAR 存档中添加一个路径名为 META-INF/MANIFEST.MF
的清单文件。有关清单文件的信息,请参阅使用清单文件:基础知识部分。
在上面的例子中,存档中的文件保留了它们的相对路径名和目录结构。Jar 工具提供了 -C
选项,你可以使用它来创建一个 JAR 文件,其中存档文件的相对路径不会被保留。它是模仿 TAR 的 -C
选项。
举个例子,假设你想将 TicTacToe 演示中使用的音频文件和 gif 图像放入一个 JAR 文件中,并且你希望所有文件都位于顶层,没有目录结构。你可以通过在 images
和 audio
目录的父目录中执行以下命令来实现:
jar cf ImageAudio.jar -C images . -C audio .
这个命令中的-C images
部分指示 Jar 工具进入images
目录,而跟在-C images
后面的.
则指示 Jar 工具归档该目录的所有内容。命令中的-C audio .
部分则对audio
目录执行相同操作。生成的 JAR 文件将具有以下目录结构:
META-INF/MANIFEST.MF cross.gif not.gif beep.au ding.au return.au yahoo1.au yahoo2.au
相比之下,假设您使用了一个不使用-C
选项的命令:
jar cf ImageAudio.jar images audio
生成的 JAR 文件将具有以下目录结构:
META-INF/MANIFEST.MF images/cross.gif images/not.gif audio/beep.au audio/ding.au audio/return.au audio/yahoo1.au audio/yahoo2.au
查看 JAR 文件的内容
查看 JAR 文件内容的基本命令格式为:
jar tf *jar-file*
让我们看看此命令中使用的选项和参数:
t
选项表示您想查看 JAR 文件的目录。f
选项表示要查看其内容的 JAR 文件在命令行上指定。jar-file
参数是您想要查看其内容的 JAR 文件的路径和名称。
t
和 f
选项可以以任意顺序出现,但它们之间不能有任何空格。
此命令将 JAR 文件的目录显示到 stdout
。
您可以选择添加详细选项 v
,以在输出中生成有关文件大小和最后修改日期的附加信息。
一个示例
让我们使用 Jar 工具列出我们在上一节中创建的 TicTacToe.jar
文件的内容:
jar tf TicTacToe.jar
此命令将 JAR 文件的内容显示到 stdout
:
META-INF/MANIFEST.MF TicTacToe.class audio/ audio/beep.au audio/ding.au audio/return.au audio/yahoo1.au audio/yahoo2.au images/ images/cross.gif images/not.gif
JAR 文件包含了 TicTacToe
类文件以及音频和图像目录,正如预期的那样。 输出还显示 JAR 文件包含一个默认清单文件 META-INF/MANIFEST.MF
,该文件是由 JAR 工具自动放置在存档中的。 有关更多信息,请参阅理解默认清单部分。
所有路径名都显示为正斜杠,无论您使用的是哪个平台或操作系统。 JAR 文件中的路径始终是相对的;例如,您永远不会看到以 C:
开头的路径。
如果使用 v
选项,JAR 工具将显示附加信息:
jar tvf TicTacToe.jar
Java 中文官方教程 2022 版(十三)(4)https://developer.aliyun.com/article/1486367