部署 Java Web Start 应用程序
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/createWebStartLaunchButtonFunction.html
您可以使用部署工具包脚本的createWebStartLaunchButton
函数部署 Java Web Start 应用程序。Java Web Start 应用程序使用 Java 网络启动协议(JNLP)启动。createWebStartLaunchButton
函数生成一个链接(HTML 锚标签 - <a>
)到 Java Web Start 应用程序的 JNLP 文件。
生成的锚标签是 Java Web Start 应用程序的按钮。当最终用户点击启动按钮时,部署工具包脚本确保已安装适当的 Java 运行时环境(JRE)软件,然后启动 Java Web Start 应用程序。
注意:根据浏览器类型,当您尝试查看网页源代码时,可能无法查看部署工具包脚本生成的 HTML。要查看生成的 HTML,请尝试在加载后保存 HTML 页面,或使用诸如 Firebug(Mozilla Firefox 附加组件)之类的工具。
注意:如果客户端没有所需的 JRE 软件最低版本,部署工具包脚本会将浏览器重定向到http://www.java.com
,以允许用户下载最新的 JRE 软件。
函数签名:createWebStartLaunchButton: function(jnlp, minimumVersion)
或createWebStartLaunchButton: function(jnlp)
参数:
-
jnlp
– 包含 Java Web Start 应用程序部署信息的 JNLP 文件的 URL。此 URL 应为绝对路径。 -
minimumVersion
– 运行此应用程序所需的 JRE 软件的最低版本
用法:
-
指定运行应用程序所需的 JRE 软件的最低版本
<script src="https://www.java.com/js/deployJava.js"></script> <script> var url = "http://java.sun.com/javase/technologies/desktop/javawebstart/apps/notepad.jnlp"; deployJava.createWebStartLaunchButton(url, '1.6.0'); </script>
-
使 Java Web Start 应用程序能够在任何 JRE 软件版本上运行
如果您的应用程序没有最低 JRE 软件版本要求,请使用
createWebStartLaunchButton: function(jnlp)
函数部署 Java Web Start 应用程序。
注意:当使用任何先前描述的createWebStartLaunchButton
函数部署时,必须在 Java Web Start 应用程序的 JNLP 文件中指定绝对的 codebase。这样可以通过javaws <path/to/local JNLP file>
命令从命令行启动 Java Web Start 应用程序。
更改启动按钮
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/changeLaunchButtonOfJWS.html
如果您不喜欢默认的启动按钮,或者您有另一幅标准化的图像,您可以更改您的 Java Web Start 应用程序的启动按钮图像。
使用deployJava.launchButtonPNG
变量指向启动按钮图像的位置。
变量: deployJava.launchButtonPNG
用法: 提供替代图像 URL
在这个例子中,记事本应用程序的启动按钮现在是杜克挥手的图像。
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
deployJava.launchButtonPNG='https://docs.oracle.com/javase/tutorial/images/DukeWave.gif';
var url = "https://docs.oracle.com/javase/tutorialJWS/samples/deployment/NotepadJWSProject/Notepad.jnlp";
deployJava.createWebStartLaunchButton(url, '1.6.0');
</script>
记事本应用程序的新启动按钮(杜克挥手)如下。点击杜克的图像启动记事本应用程序。
//<![CDATA[ deployJava.launchButtonPNG='https://docs.oracle.com/javase/tutorial/images/DukeWave.gif'; var url = 'https://docs.oracle.com/javase/tutorialJWS/samples/deployment/NotepadJWSProject/Notepad.jnlp'; deployJava.createWebStartLaunchButton(url, '1.6.0'); //]]>
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
在没有 Codebase 的情况下部署
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/deployingWithoutCodebase.html
从 Java SE 7 发行版开始,您不必为 Java Web Start 应用程序的 Java 网络启动协议 (JNLP) 文件中的codebase
属性指定绝对路径。您可以在不修改codebase
属性中的路径的情况下在不同环境中开发和测试应用程序。如果未指定 codebase,则 Java Web Start 软件会假定 codebase 相对于启动 Java Web Start 应用程序的网页。
当 JNLP 文件不包含codebase
属性时,可以使用部署工具脚本的以下函数在网页中部署 Java Web Start 应用程序:
-
launchWebStartApplication
– 在 HTML 链接中使用此函数部署您的 Java Web Start 应用程序。 -
createWebStartLaunchButtonEx
– 使用此函数为您的 Java Web Start 应用程序创建一个启动按钮。
注意: 要运行通过先前指定的函数部署的 Java Web Start 应用程序,至少需要 Java SE 7 发行版。如果客户端没有至少 Java SE 7 发行版,函数会指示用户在启动 Java Web Start 应用程序之前安装所需的 Java Runtime Environment (JRE) 软件。
函数签名: launchWebStartApplication: function(jnlp)
参数:
jnlp
– 包含 Java Web Start 应用程序部署信息的 JNLP 文件的路径。此路径可以相对于部署 Java Web Start 应用程序的网页。
用法:
在以下示例中,launchWebStartApplication
函数在 HTML anchor (a)
标签的href
属性中被调用。
dynamictree_webstart_no_codebase.jnlp
JNLP 文件用于部署动态树演示应用程序。
<script src="https://www.java.com/js/deployJava.js"></script>
<a href="javascript:deployJava.launchWebStartApplication('dynamictree_webstart_no_codebase.jnlp');">Launch</a>
当用户点击生成的 HTML 链接时,将启动 Java Web Start 应用程序。
函数签名: createWebStartLaunchButtonEx: function(jnlp)
参数:
jnlp
– 包含 Java Web Start 应用程序部署信息的 JNLP 文件的路径。此路径可以相对于部署 Java Web Start 应用程序的网页。
用法:
以下示例展示了createWebStartLaunchButtonEx
函数的用法。
dynamictree_webstart_no_codebase.jnlp
JNLP 文件用于部署动态树演示应用程序。
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
var jnlpFile = "dynamictree_webstart_no_codebase.jnlp";
deployJava.createWebStartLaunchButtonEx(jnlpFile);
</script>
当用户点击生成的启动按钮时,将启动 Java Web Start 应用程序。
在浏览器中打开JavaWebStartAppPage_No_Codebase.html
以查看通过本主题中描述的功能部署的动态树演示应用程序。
注意:
您还可以通过在系统命令提示符中使用完整的 JNLP 文件的 URL 调用javaws
命令来启动 Java Web Start 应用程序,如下面的代码片段所示。
javaws http://example.com/dynamictree_webstart_no_codebase.jnlp
下载源代码以进一步进行实验的动态树演示示例。
检查客户端 JRE 软件版本
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/jreVersionCheck.html
有许多原因要检查客户端计算机上是否安装了特定版本的 Java 运行时环境(JRE)软件。例如,您可能希望根据客户端的 JRE 软件版本启动不同版本的富互联网应用程序(RIA),或者根据客户端的 JRE 软件版本将用户重定向到不同的页面。
使用部署工具包脚本的versionCheck
函数来检查客户端是否安装了特定版本或一系列 JRE 版本。
函数签名: versionCheck: function(versionPattern)
参数:
versionPattern
– 字符串,指定要检查的版本或版本范围,例如"1.4","1.5.0*"(1.5.x 系列),以及"1.6.0_02+"(大于或等于 1.6.0_02 的任何版本)。
用法: 根据客户端的 JRE 软件版本创建不同的用户体验
在这个例子中,仅当客户端上的 JRE 软件版本大于或等于 1.6 时,才会为记事本应用程序创建一个启动按钮。如果不是,则浏览器将重定向到oracle.com
。
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
if (deployJava.versionCheck('1.6+')) {
var url = "https://docs.oracle.com/javase/tutorialJWS/deployment/webstart/examples/Notepad.jnlp";
<!-- you can also invoke deployJava.runApplet here -->
deployJava.createWebStartLaunchButton(url, '1.6.0');
} else {
document.location.href="http://oracle.com";
}
</script>
注意: 根据客户端操作系统和 Java 平台的版本,您可能可以在 JRE 软件的主要版本级别(例如 1.6)或更精细的更新级别(例如 1.6.0_10)上验证版本信息。
Java 网络启动协议
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/jnlp.html
Java 网络启动协议(JNLP)使应用程序能够通过使用托管在远程 Web 服务器上的资源在客户端桌面上启动。Java 插件软件和 Java Web 启动软件被视为 JNLP 客户端,因为它们可以在客户端桌面上启动远程托管的小程序和应用程序。有关详细信息,请参阅Java 网络启动协议和 API 规范更改日志。
最近部署技术的改进使我们能够通过使用 JNLP 启动丰富的互联网应用程序(RIA)。通过使用这种协议,可以启动小程序和 Java Web 启动应用程序。通过使用 JNLP 启动的 RIA 还可以访问 JNLP API。这些 JNLP API 允许 RIA 在用户许可的情况下访问客户端桌面。
JNLP 由 RIA 的 JNLP 文件启用。JNLP 文件描述了 RIA。JNLP 文件指定了主 JAR 文件的名称,运行 RIA 所需的 Java 运行时环境软件的版本,名称和显示信息,可选包,运行时参数,系统属性等。
您可以在以下主题中找到有关通过使用 JNLP 部署 RIA 的更多信息:
-
部署小程序
-
部署 Java Web 启动应用程序
-
JNLP API
-
JNLP 文件的结构
JNLP 文件的结构
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/jnlpFileSyntax.html
本主题描述了用于丰富互联网应用程序(RIA)的 Java 网络启动协议(JNLP)文件的语法。
下面的代码片段显示了一个 Java Web Start 应用程序的示例 JNLP 文件:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="" href="">
<information>
<title>Dynamic Tree Demo</title>
<vendor>Dynamic Team</vendor>
<icon href="sometree-icon.jpg"/>
<offline-allowed/>
</information>
<resources>
<!-- Application Resources -->
<j2se version="1.6+" href=
"http://java.sun.com/products/autodl/j2se"/>
<jar href="DynamicTreeDemo.jar"
main="true" />
</resources>
<application-desc
name="Dynamic Tree Demo Application"
main-class="webstartComponentArch.DynamicTreeApplication"
width="300"
height="300">
</application-desc>
<update check="background"/>
</jnlp>
下表描述了 JNLP 文件中常用的元素和属性。单击父链接查看元素的父级。
注意: 此表格不包括 JNLP 文件的所有可能内容。有关更多信息,请参阅Java 网络启动协议和 API 规范更改日志。
JNLP 文件中常用的元素和属性
元素 | 属性 | 描述 | 自版本 | 必需 |
---|---|---|---|---|
jnlp | JNLP 文件的最顶层 xml 元素。 | 1.0 | 是 | |
spec | 属性的值可以是 1.0、1.5 或 6.0,也可以使用通配符,如 1.0+。表示此 JNLP 文件可以使用的 JNLP 规范的最低版本。 | 1.0 | ||
codebase | JNLP 文件中 href 属性中指定的所有相对 URL 的基本位置。 |
1.0 | ||
href | JNLP 文件本身的 URL。 | 1.0 | ||
version | 正在启动的 RIA 的版本,以及 JNLP 文件本身的版本。 | 1.0 | ||
information ^(parent) | 包含描述 RIA 及其来源的其他元素。 | 1.0 | 是 |
| | os | 应考虑的操作系统。 | 1.5.0 | |
title ^(parent) |
vendor ^(parent) |
homepage ^(parent) |
description ^(parent) |
icon ^(parent) |
offline-allowed ^(父级) |
快捷方式 ^(父级) |
桌面 ^(父级) |
菜单 ^(父级) |
关联 ^(父级) |
相关内容 ^(父级) |
更新 ^(父级) |
安全 ^(父级) |
all-permissions ^(父级) |
j2ee-application-client-permissions ^(父级) |
资源 ^(父级) |
java or j2se ^(parent) |
jar ^(parent) |
nativelib ^(parent) |
extension ^(parent) |
ext-download ^(parent) |
package ^(parent) |
property ^(parent) |
application-desc ^(parent) |
argument ^(parent) |
applet-desc ^(parent) |
param ^(parent) |
component-desc ^(parent) |
installer-desc ^(parent) |
编码 JNLP 文件
Java Web Start 软件支持在 Java 平台支持的任何字符编码中对 JNLP 文件进行编码。有关 Java 平台中字符编码的更多信息,请参阅支持的编码指南。要对 JNLP 文件进行编码,请在该文件的 XML prolog 中指定一个编码。例如,以下行表示 JNLP 文件以 UTF-16 编码。
<?xml version="1.0" encoding="utf-16"?>
注意: XML prolog 本身必须是 UTF-8 编码的。
部署最佳实践
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/bestPractices.html
你可以通过本主题中描述的最佳实践来提高富互联网应用程序(RIA)的用户体验。
-
使用来自认可证书颁发机构的证书对 RIA 进行签名。确保所有工件都已签名,并且证书尚未过期。请参阅签署和验证 JAR 文件以获取有关签名的信息。
-
请求所需的最低权限级别。如果 RIA 不需要对用户系统的无限制访问,请指定权限级别为沙盒。请参阅富互联网应用程序中的安全性以获取更多安全指南。
-
优化 JAR 文件和相关资源的大小,以便您的 RIA 可以快速加载。请参阅减少下载时间以获取优化技巧。
-
启用版本下载协议并使用后台更新检查以使您的 RIA 快速启动。请参阅避免不必要的更新检查以了解更多关于版本下载协议和更新检查的信息。
-
确保客户端具有所需版本的 Java 运行时环境软件。请参阅确保 JRE 软件的存在以了解部署工具包脚本如何用于此目的的详细信息。
-
将 applet 的 JNLP 文件内容嵌入
<applet>
标签中,以避免从网络加载 JNLP 文件。此功能是在 Java SE 7 版本中引入的。请参阅在 Applet 标签中嵌入 JNLP 文件以了解如何在网页中嵌入 applet 的 JNLP 文件内容。 -
如有可能,预加载您的 Java Web Start 应用程序。如果您计划将 RIA 部署为具有一定管理控制权的企业中的 Java Web Start 应用程序,则可以将应用程序预加载到各个客户端,以便缓存并准备使用。使用以下命令预加载您的 Java Web Start 应用程序:
javaws -import -silent *<jnlp url>*
减少下载时间
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/reducingDownloadTime.html
当用户尝试访问时,从网站下载富互联网应用程序(RIA)。 (初始下载后,可以缓存 RIA 以提高性能)。 下载 RIA 所需的时间取决于 RIA 的 JAR 文件大小。 更大的 JAR 文件下载时间更长。
通过应用以下技术,您可以减少 RIA 的下载时间:
-
使用
pack200
工具压缩 RIA 的 JAR 文件。 -
从 Java 网络启动协议(JNLP)文件和 JavaScript 文件中删除不必要的空白。
-
优化图像和动画。
以下步骤描述了如何为已签名的 RIA 创建和部署压缩的 JAR 文件。
-
使用
--repack
选项对 JAR 文件进行规范化。此步骤确保在启动 RIA 时安全证书和 JAR 文件将通过验证检查。
pack200 --repack DynamicTreeDemo.jar
-
对规范化的 JAR 文件进行签名。
jarsigner -keystore myKeyStore DynamicTreeDemo.jar me
其中
myKeyStore
是密钥库的名称,me
是密钥库的别名。 -
打包已签名的 JAR 文件
pack200 DynamicTreeDemo.jar.pack.gz DynamicTreeDemo.jar
-
在 RIA 的 JNLP 文件中将
jnlp.packEnabled
属性设置为true
。<resources> <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" max-heap-size="128m" /> <jar href="DynamicTreeDemo.jar" main="true"/> <property name="jnlp.packEnabled" value="true"/> <!-- ... --> </resources>
当在 JNLP 文件中设置jnlp.packEnabled
属性时,Java 插件软件会查找具有.pack.gz
扩展名的压缩 JAR 文件(例如,DynamicTreeDemo.jar.pack.gz
)。 如果找到,则 Java 插件软件会自动解压缩和加载 JAR 文件。 如果找不到具有.pack.gz
扩展名的文件,则 Java 插件软件会尝试加载常规 JAR 文件(例如,DynamicTreeDemo.jar
)。
注意: 您需要将 RIA 部署在 Web 服务器上以测试jnlp.packEnabled
属性。
避免不必要的更新检查
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/avoidingUnnecessaryUpdateChecks.html
富互联网应用程序(RIA)在本地缓存以提高启动时间。但是,在启动 RIA 之前,启动软件会检查确保 RIA 的 Java 网络启动协议(JNLP)文件中引用的每个 JAR 文件都是最新的。换句话说,启动软件确保您运行的是 RIA 的最新版本,而不是旧的缓存副本。这些更新检查可能需要几百毫秒,具体取决于 JAR 文件数量和网络速度。使用本主题中描述的技术来避免不必要的更新检查,并提高 RIA 的启动时间。
注意:
此处使用术语“启动软件”来统称 Java 插件软件和 Java Web Start 软件。Java 插件软件用于启动小程序,而 Java Web Start 软件用于启动 Java Web Start 应用程序。
利用版本下载协议
您可以利用版本下载协议来消除不必要的版本检查。请参阅以下步骤以启用此协议。
-
将 JAR 文件重命名为包含版本号后缀的命名约定如下:
*<JAR file name>*__V*<version number>*.jar
例如,将
DynamicTreeDemo.jar
重命名为DynamicTreeDemo__V1.0.jar
。 -
在 JNLP 文件中为每个 JAR 文件指定一个版本,并将
jnlp.versionEnabled
属性设置为true
。<resources> <!-- Application Resources --> <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" max-heap-size="128m" /> <jar href="DynamicTreeDemo.jar" main="true" version="1.0"/> <jar href="SomeOther.jar" version="2.0"/> <property name="jnlp.versionEnabled" value="true"/> <!-- ... --> </resources>
当启用
jnlp.versionEnabled
属性时,启动软件仅执行一次更新检查,以确保 JNLP 文件是最新的。软件将 JNLP 文件中指定的版本号与相应的 JAR 文件版本(根据第 1 步中提到的命名约定)进行比较,并仅更新过时的 JAR 文件。这种方法非常高效,因为仅在网络上进行 JNLP 文件的更新检查。所有其他版本检查都在本地进行。如果未找到具有正确版本号的文件,则启动软件将尝试加载默认的 JAR 文件(例如,
DynamicTreeDemo.jar
)。
在后台执行更新检查
如果用户立即运行您的 RIA 的最新版本并不是关键,您可以指定所有更新检查应在后台进行。在这种情况下,启动软件将启动本地缓存副本以供立即使用,并在后台下载 RIA 的新版本。下次用户尝试使用您的 RIA 时,将启动新版本的 RIA。要启用后台更新检查,请将以下行添加到您的 JNLP 文件中:
<update check='background'/>
以下代码片段显示了启用后台更新检查的示例 JNLP 文件:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="" href="">
<information>
<title>Applet Takes Params</title>
<vendor>Dynamic Team</vendor>
</information>
<resources>
<!-- Application Resources -->
<j2se version="1.6+" href=
"http://java.sun.com/products/autodl/j2se"/>
<jar href="applet_AppletWithParameters.jar"
main="true" />
</resources>
<applet-desc
name="Applet Takes Params"
main-class="AppletTakesParams"
width="800"
height="50">
<param name="paramStr" value="someString"/>
<param name="paramInt" value="22"/>
</applet-desc>
<update check="background"/>
</jnlp>
确保 JRE 软件的存在
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/ensuringJRE.html
富互联网应用程序(RIA)通常需要客户端计算机上存在 Java 运行时环境(JRE)软件的最低版本。在部署 RIA 时,您需要确保客户端计算机安装了所需版本的 JRE 软件,以便您的 RIA 能够正常运行。使用部署工具包脚本,您至少有两种处理此要求的方式。
-
您可以在用户访问您的网站时立即检查客户端 JRE 软件的版本,并在必要时安装最新版本。
-
您可以让用户浏览网站,并在他们尝试使用您的 RIA 时检查并安装最新的 JRE。
当用户访问您的网站时检查并安装最新的 JRE 软件
以下示例检查用户是否安装了至少版本为 1.6.0_13 的 JRE 软件。如果没有,则代码会安装最新的 JRE 软件。请参见代码中的内联注释。
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
// check if current JRE version is greater than 1.6.0
alert("versioncheck " + deployJava.versionCheck('1.6.0_10+'));
if (deployJava.versionCheck('1.6.0_10+') == false) {
userInput = confirm(
"You need the latest Java(TM) Runtime Environment. " +
"Would you like to update now?");
if (userInput == true) {
// Set deployJava.returnPage to make sure user comes back to
// your web site after installing the JRE
deployJava.returnPage = location.href;
// Install latest JRE or redirect user to another page to get JRE
deployJava.installLatestJRE();
}
}
</script>
仅在用户尝试使用您的 RIA 时安装正确的 JRE 软件
当您在 runApplet
或 createWebStartLaunchButton
函数中指定 JRE 软件的最低版本时,部署工具包脚本会确保客户端上存在所需版本的 JRE 软件才能运行您的 RIA。
使用 runApplet
函数部署小程序,如下例所示。runApplet
函数的最后一个参数是运行您的小程序所需的最低版本(版本 1.6)。
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
var attributes = { code:'components.DynamicTreeApplet',
width:300, height:300};
var parameters = {jnlp_href: 'dynamictree_applet.jnlp'};
deployJava.runApplet(attributes, parameters, '1.6');
</script>
要部署 Java Web Start 应用程序,请使用 createWebStartLaunchButton
函数并使用正确的最低版本参数(版本 1.6)。
<script src="https://www.java.com/js/deployJava.js"></script>
<script>
var url = "dynamictree_applet.jnlp";
deployJava.createWebStartLaunchButton(url, '1.6.0');
</script>
runApplet
和 createWebStartLaunchButton
函数检查客户端的 JRE 软件版本。如果未安装最低版本,则函数会安装最新版本的 JRE 软件。
问题和练习:深入部署
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/QandE/questions.html
问题
-
哪个脚本包含部署小程序和 Java Web Start 应用程序的函数?
-
真或假:你应该始终签署你的 RIA,以确保它始终正常工作。
练习
- 编写 JavaScript 代码,使用
ex.jnlp
文件部署Exercise
小程序。
检查你的答案。
教程:部署自包含应用程序
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/index.html
自包含应用程序由一个单独的可安装捆绑包组成,其中包含您的应用程序和运行应用程序所需的 JRE 的副本。当安装应用程序时,它的行为与任何本地应用程序相同。为用户提供自包含应用程序可以避免在浏览器中运行应用程序时出现的安全问题。
您可以通过提供自己的图标来自定义自包含应用程序。可以设置文件关联,因此当用户打开您的应用程序可以处理的文件时,您的应用程序会自动启动。支持多个入口点,因此您可以在单个自包含应用程序捆绑包中提供一套应用程序。
可使用 Java 打包工具打包自包含应用程序。javapackager
命令可以从命令行创建自包含应用程序的捆绑包。NetBeans 也可以用于创建自包含应用程序捆绑包。本课程描述了如何使用 Ant 任务创建这些捆绑包。
其他参考资料
有关自包含应用程序的更多信息,请参阅 Java 平台标准版部署指南中的自包含应用程序打包。
有关 Java 打包的 Ant 任务的信息,请参阅JavaFX Ant Tasks,用于打包 Java SE 和 JavaFX 应用程序。
有关javapackager
命令的信息,请参阅Java 部署工具。
打包自包含应用程序的先决条件
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/prereqs.html
编译和打包应用程序需要 Java 开发工具包(JDK)。可安装的捆绑包必须在自包含应用程序将运行的平台上创建。例如,如果您的应用程序在 Windows 和 Linux 上运行,您必须在 Windows 上运行打包工具来创建.exe
或.msi
捆绑包,并在 Linux 上运行打包工具来创建.rpm
或.deb
文件。
创建可安装的捆绑包需要第三方工具。以下表格标识了每个支持平台的工具。
平台 | 格式 | 工具 |
---|---|---|
Windows | EXE | Inno Setup 5 或更高版本 |
Windows | MSI | WiX Toolset 3.8 或更高版本 |
Linux | RPM | RPMBuild |
Linux | DEB | Debian 打包工具 |
OS X | DMG | |
OS X | PKG |
转换现有应用程序
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/converting.html
任何独立的 Java 应用程序或 Java Web Start 应用程序都可以打包为自包含应用程序。如果您有一个 Java 小程序,请参阅将 Java 小程序重写为 Java Web Start 应用程序以获取有关将小程序转换为 Java Web Start 应用程序的信息,然后可以将其打包为自包含应用程序。
在转换应用程序之前,请确保您的平台上已安装所需的先决条件。有关信息,请参阅打包自包含应用程序的先决条件。
本节将 Dynamic Tree Demo 从部署 Java Web Start 应用程序转换为自包含应用程序。您可以从自包含应用程序示例下载此演示的源文件。
设置目录
确定并组织应用程序所需的文件。一个简单的应用程序可能只需要一个 JAR 文件。一个更复杂的应用程序可能还需要额外的库或资源。自定义资源,如图标或配置文件,也可以被自包含应用程序使用。
Dynamic Tree Demo 只需要DynamicTreeDemo.jar
文件,该文件位于项目的/dist
目录中。用于 Java Web Start 版本的应用程序所需的 HTML 和 JNLP 文件不再需要,并且被自包含应用程序的打包工具忽略。
为 Dynamic Tree Demo 提供自定义图标,代表应用程序在用户桌面上安装时的图标,为每个支持的平台提供一个图标。这些图标放置在/src/package/
platform``目录中。为每个支持的平台提供不同格式的图标:Windows 使用.ico
格式,Linux 使用.png
格式,OS X 使用.icns
格式。
下面的示例显示了在创建自包含捆绑包之前 Dynamic Tree Demo 项目的目录结构:
/packager_DynamicTreeDemo <--- application project
/dist
DynamicTreeDemo.jar
...
/src
/package <--- custom resources
/linux
/macosx
/windows
/webstartComponentArch <--- application source files
...
设置构建文件
设置所需的打包任务的 Ant 任务。这些任务可以添加到项目的build.xml
文件中,或放在一个被build.xml
文件导入的单独文件中。
对于 Dynamic Tree Demo,项目的根目录中的packager.xml
文件包含了用于生成自包含应用程序包的 Ant 任务。packager.xml
文件的源代码如下所示:
<project name="DynamicTreePackaging" default="default" basedir="." >
<echo>${java.home}/../lib/ant-javafx.jar</echo>
<target name="package" depends="jar">
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant"
classpath="${java.home}/../lib/ant-javafx.jar;src"/>
<fx:deploy outdir="${basedir}/build/packager"
outfile="DynamicTreeDemo"
nativeBundles="all"
verbose="false">
<fx:application name="Dynamic Tree Demo"
mainClass="webstartComponentArch.DynamicTreeApplication"
version="1.0"
/>
<fx:resources>
<fx:fileset dir="dist" includes="DynamicTreeDemo.jar"/>
</fx:resources>
<fx:info title="Dynamic Tree Demo"
vendor="My Company"
description="A Demo of a Dynamic Swing Tree"
category="Demos"
copyright="(c) 2014 My Company"
license="3 Clause BSD"
/>
<fx:bundleArgument arg="linux.bundleName" value="dynamic-tree-demo"/>
<fx:bundleArgument arg="email" value="[email protected]"/>
<fx:bundleArgument arg="mac.CFBundleName" value="Java Tree Demo"/>
<fx:bundleArgument arg="win.menuGroup" value="Java Demos"/>
</fx:deploy>
</target>
</project>
使用以下信息设置 Ant 任务:
-
为命名空间使用
xmlns:fx="javafx:com.sun.javafx.tools.ant
。 -
必须在
fx:deploy
任务之前执行taskdef
任务。classpath
属性包含来自 JDK 的ant-javafx.jar
文件的位置和包含自定义资源的目录。对于动态树演示,classpath
属性包括包含自定义图标的/src
目录。 -
将
fx:deploy
任务放在所需的目标内。指定本机二进制文件放置的输出目录,并指定要生成的本机二进制文件。如果为本机二进制文件指定了
all
,则将为您在执行此任务文件的平台上生成所有可能的二进制文件,包括磁盘映像。所有平台的有效值为all
;image
,在 Windows 和 Linux 上生成文件目录,在 OSX 上生成.app
文件;以及installer
,仅为平台生成可安装的捆绑包,而不生成磁盘映像。特定于平台的二进制文件的有效值为 Windows 的exe
和msi
;Linux 的deb
和rpm
;OS X 的deb
、pkg
和mac.appStore
。您必须安装所需的工具以构建您选择的二进制文件。对于动态树演示,
outdir
属性设置为${basedir}/build/packager
。basedir
在project
元素中定义,在本例中设置为当前目录。nativeBundles
属性设置为all
,因此将构建在运行打包任务的平台上的所有格式。 -
verbose
属性是可选的。使用此属性提供诊断信息。 -
提供有关应用程序的信息。在
fx:application
元素的name
属性和fx:info
元素的title
属性中设置应用程序的名称。在fx:application
元素的version
属性中设置应用程序的版本。使用fx:info
元素提供应用程序的描述、供应商名称、许可信息和其他元数据。 -
关于 JAR 文件和其他资源的信息设置在
fx:resources
元素中。 -
启动信息设置在
fx:application
元素的mainclass
属性中。对于动态树演示,使用简单的单个启动器
webstartComponentArch.DynamicTreeApplication
,这是应用程序的主类。 -
其他平台特定的自定义设置在
fx:bundleArgument
元素中提供。未被打包程序识别的参数将被忽略,因此一个构建文件可以包含所有平台的打包信息。对于动态树演示,应用了以下自定义设置:
-
Linux 的捆绑包名称设置为
dynamic-tree-demo
。 -
提供了一个电子邮件地址。
-
在 OS X 菜单栏中显示的名称设置为
Java Tree Demo
。 -
在 Windows 中存储应用程序的菜单组名称设置为
Java Demos
。
-
生成捆绑包
运行您在要为自包含应用程序构建捆绑包的平台上创建的打包任务。
对于动态树演示,请从项目的根目录运行以下命令:
ant package
当打包任务完成时,应用项目中的build/packager/bundles
目录包含生成的本机二进制文件。
以下示例显示了在为 Windows 生成自包含捆绑包后,动态树演示项目的目录结构:
/packager_DynamicTreeDemo <--- application project
/build
/packager
/bundles
Dynamic Tree Demo <---folder image
Dynamic Tree Demo-1.0.exe <---EXE installer
Dynamic Tree Demo-1.0.msi <---MSI installer
...
/dist
DynamicTreeDemo.jar
...
/src
/package <--- custom resources
/linux
/macosx
/windows
/webstartComponentArch <--- application source files
...
请注意,除了自包含捆绑包之外,打包工具始终会为应用程序生成 JAR、JNLP 和 HTML 文件。这些文件提供了分发应用程序的其他选项。
其他参考资料
欲了解更多关于自包含应用程序的信息,请参阅自包含应用程序打包。
欲了解有关 Java 打包工具的 Ant 任务的更多信息,请参阅
使用文件关联
原文:
docs.oracle.com/javase/tutorial/deployment/selfContainedApps/fileassociation.html
为用户提供自包含应用程序的一个优势是能够设置文件关联。 可以基于 MIME 类型或文件扩展名将特定类型的文件与您的应用程序关联起来,以便您的应用程序用于打开关联的文件。 例如,如果您的应用程序编辑文本文件,则可以设置一个文件关联,当用户双击扩展名为.txt
的文件时运行您的应用程序。
File Association Demo 读取 JavaScript 和 Groovy 代码。 使用 MIME 类型和文件扩展名,应用程序与 JavaScript 和 Groovy 文件关联。
您可以从 Self-Contained Application Examples 下载 File Association Demo 的源文件。
设置文件关联
用于生成自包含应用程序捆绑包的 Ant 任务位于 File Association Demo 的build.xml
文件中。 <fx:association>
Ant 元素用于将文件扩展名或 MIME 类型与您的应用程序关联起来。 Linux 捆绑程序需要 MIME 类型,Windows 捆绑程序需要文件扩展名,OS X 捆绑程序至少需要其中一个属性。 最佳实践是同时使用 MIME 类型和文件扩展名,使 MIME 类型和文件扩展名之间实现一对一映射,这样您可以在多个平台上使用相同的构建文件。 有关此元素的更多信息,请参见fx:association。
以下代码显示了在fx:deploy
元素中需要包含的内容,以将应用程序与扩展名.js
和.groovy
以及 MIME 类型text/javascript
和text/x-groovy
关联起来。
<fx:info title="File Association Demo"
vendor="MySamples"
description="A Demo of File Associations for Java Packager"
category="Demos"
license="3 Clause BSD">
<fx:association extension="js" mimetype="text/javascript" description="JavaScript Source"/>
<fx:association extension="groovy" mimetype="text/x-groovy" description="Groovy Source"/>
</fx:info>
如果捆绑程序不支持文件关联,则将忽略关联。 截至 JDK 的 8u40 版本,Windows EXE 和 MSI 捆绑程序,Linux DEB 和 RPM 捆绑程序以及 Mac .app 捆绑程序支持文件关联。 OS X PKG 和 DMG 捆绑程序通过使用 Mac .app 捆绑程序支持文件关联。
请查看build.xml
以获取完整的构建代码。
要生成 File Association Demo 的可安装捆绑包,请参见 Converting an Existing Application 中的“生成捆绑包”部分。
从关联文件启动
安装程序在将自包含应用程序捆绑包安装到用户系统时设置文件关联。 安装应用程序后,打开与您的应用程序关联的文件会导致启动您的应用程序。 启动应用程序所采取的操作取决于其运行的平台。
在 Linux 和 Windows 上启动
在 Linux 和 Windows 上,当基于文件关联启动应用程序时,被打开的文件作为参数传递给主类,该主类覆盖了类的默认参数。对于文件关联演示,参数在启动应用程序的实例后传递给loadscript
方法。每打开一个文件,都会启动一个不同的应用程序实例。
请查看ScriptRunnerApplication.java
以获取 Linux 和 Windows 版本的代码。
在 OS X 上启动
在 OS X 上,只运行一个应用程序实例。当打开关联文件时,会向应用程序发送一个事件。应用程序必须注册一个事件监听器来处理该事件。
OS X 的文件关联演示有一个子类,其主方法与 Linux 和 Windows 版本不同。该主方法处理默认参数的方式与 Linux 和 Windows 版本的主方法相同,然后向 OS X 注册一个监听器以处理FileOpenHandler
。当打开关联文件时,此监听器的事件方法被调用,并且文件名从OpenFilesEvent
对象的getFiles
方法中提取。
请查看ScriptRunnerApplicationMac.java
以获取 OS X 版本的代码。
构建 OS X 版本的文件关联演示需要访问随 Oracle JDK 提供的 OS X 特定类。大多数com.apple.eawt
类不包含在javac
编译器使用的符号文件中。为了告诉编译器忽略符号文件,在构建文件中的-pre-init
Ant 任务中向javac
编译器传递-XDignore.symbol.file=true
参数。请参见build.xml
。
关于文件关联演示的更多信息
文件关联演示项目包含了应用程序的 Java 源文件,位于/src/sample/fa
目录中。自定义图标位于/src/package/
platform``目录中。要与应用程序打包的示例文件位于/src
目录中。
为了处理 Groovy 代码,文件关联演示需要 Groovy 库。构建过程会将 Groovy 库下载到/lib
目录。有关信息,请参见添加外部库。
JAR 文件生成后,构建过程将/src
和/lib
目录复制到/dist
目录。然后,/dist
目录中包含了应用程序的所有文件。
文件关联演示接受文件名作为参数。如果应用程序是通过打开关联文件启动的,那么关联文件的名称将被传递进来。如果应用程序是直接启动的,则会传递应用程序捆绑的示例文件 sample.js
。请参阅提供默认参数以获取更多信息。
需要管理员权限才能设置文件关联。默认情况下,Windows 的 EXE 安装程序不会请求管理员权限。为了强制请求文件关联演示的管理员权限,捆绑参数 win.exe.systemWide
被设置为 true
。这个设置表示执行系统范围的安装,需要管理员权限。
文件关联演示在 Linux、OS X 和 Windows 上运行。演示设置为使用一个包含所有平台信息的单个构建文件。请参阅为所有平台使用通用构建文件以获取更多信息。
附加资源
欲了解更多关于文件关联的信息,请参阅将文件与独立应用程序关联。
欲了解关于 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>
元素来定义参数。可以通过为每个参数添加一个<fx:argument>
元素来传递多个参数。有关此元素的信息,请参阅fx:argument。
在使用文件关联中描述的文件关联演示设置为使用打包在应用程序中的示例文件之一的名称作为默认参数。
build.xml
文件中<fx:deploy>
任务中的以下代码显示了如何定义默认参数:
<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>
-
<fx:bundleArgument>
元素用于向不同的打包程序传递参数。未被打包程序使用的参数将被忽略,因此构建文件可以包含所有平台所需的参数。以下代码定义了 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="[email protected]"/> <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
目录包含两个应用程序的源文件。
您可以从自包含应用程序示例下载多个启动器演示的源文件。
自包含应用程序的主要入口点由<fx:application>
元素的mainClass
属性标识。在多个启动器演示中,主要入口点是文件关联演示。主类为 Linux 和 Windows 的sample.fa.ScriptRunnerAppliation
,或者 OS X 的sample.fa.ScriptRunnerApplicationMac
。有关在跨平台使用单个构建文件时确定要使用的类的信息,请参见为所有平台使用通用构建文件。
每个次要入口点由<fx:secondaryLauncher>
元素的一个实例标识。有关此元素的信息,请参见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 类型必须始终用于设置文件关联。
-
用于识别
<fx:deploy>
Ant 任务中自包含应用程序的入口点的元素是什么?
练习
-
编写
<fx:deploy>
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
例如,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
中的类现在已经加载到类路径中。