Java 中文官方教程 2022 版(十三)(1)https://developer.aliyun.com/article/1486364
部署最佳实践
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/bestPractices.html
你可以通过本主题中描述的最佳实践来提高富互联网应用程序(RIA)的用户体验。
- 使用来自认可证书颁发机构的证书对 RIA 进行签名。确保所有工件都已签名,并且证书尚未过期。请参阅签署和验证 JAR 文件以获取有关签名的信息。
- 请求所需的最低权限级别。如果 RIA 不需要对用户系统的无限制访问,请指定权限级别为沙盒。请参阅富互联网应用程序中的安全性以获取更多安全指南。
- 优化 JAR 文件和相关资源的大小,以便您的 RIA 可以快速加载。请参阅减少下载时间以获取优化技巧。
- 启用版本下载协议并使用后台更新检查以使您的 RIA 快速启动。请参阅避免不必要的更新检查以了解更多关于版本下载协议和更新检查的信息。
- 确保客户端具有所需版本的 Java 运行时环境软件。请参阅确保 JRE 软件的存在以了解部署工具包脚本如何用于此目的的详细信息。
- 将 applet 的 JNLP 文件内容嵌入
标签中,以避免从网络加载 JNLP 文件。此功能是在 Java SE 7 版本中引入的。请参阅在 Applet 标签中嵌入 JNLP 文件以了解如何在网页中嵌入 applet 的 JNLP 文件内容。
如有可能,预加载您的 Java Web Start 应用程序。如果您计划将 RIA 部署为具有一定管理控制权的企业中的 Java Web Start 应用程序,则可以将应用程序预加载到各个客户端,以便缓存并准备使用。使用以下命令预加载您的 Java Web Start 应用程序:
使用
pack200
工具压缩 RIA 的 JAR 文件。从 Java 网络启动协议(JNLP)文件和 JavaScript 文件中删除不必要的空白。
优化图像和动画。
使用
--repack
选项对 JAR 文件进行规范化。
此步骤确保在启动 RIA 时安全证书和 JAR 文件将通过验证检查。对规范化的 JAR 文件进行签名。
其中
myKeyStore
是密钥库的名称,me
是密钥库的别名。打包已签名的 JAR 文件
在 RIA 的 JNLP 文件中将
jnlp.packEnabled
属性设置为true
。将 JAR 文件重命名为包含版本号后缀的命名约定如下:
例如,将
DynamicTreeDemo.jar
重命名为DynamicTreeDemo__V1.0.jar
。在 JNLP 文件中为每个 JAR 文件指定一个版本,并将
jnlp.versionEnabled
属性设置为true
。当启用
jnlp.versionEnabled
属性时,启动软件仅执行一次更新检查,以确保 JNLP 文件是最新的。软件将 JNLP 文件中指定的版本号与相应的 JAR 文件版本(根据第 1 步中提到的命名约定)进行比较,并仅更新过时的 JAR 文件。这种方法非常高效,因为仅在网络上进行 JNLP 文件的更新检查。所有其他版本检查都在本地进行。
如果未找到具有正确版本号的文件,则启动软件将尝试加载默认的 JAR 文件(例如,DynamicTreeDemo.jar
)。您可以在用户访问您的网站时立即检查客户端 JRE 软件的版本,并在必要时安装最新版本。
您可以让用户浏览网站,并在他们尝试使用您的 RIA 时检查并安装最新的 JRE。
哪个脚本包含部署小程序和 Java Web Start 应用程序的函数?
真或假:你应该始终签署你的 RIA,以确保它始终正常工作。
编写 JavaScript 代码,使用
ex.jnlp
文件部署Exercise
小程序。为命名空间使用
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
。
javaws -import -silent *<jnlp url>*
减少下载时间
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/reducingDownloadTime.html
当用户尝试访问时,从网站下载富互联网应用程序(RIA)。 (初始下载后,可以缓存 RIA 以提高性能)。 下载 RIA 所需的时间取决于 RIA 的 JAR 文件大小。 更大的 JAR 文件下载时间更长。
通过应用以下技术,您可以减少 RIA 的下载时间:
以下步骤描述了如何为已签名的 RIA 创建和部署压缩的 JAR 文件。
pack200 --repack DynamicTreeDemo.jar
jarsigner -keystore myKeyStore DynamicTreeDemo.jar me
pack200 DynamicTreeDemo.jar.pack.gz DynamicTreeDemo.jar
<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 file name>*__V*<version number>*.jar
<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>
在后台执行更新检查
如果用户立即运行您的 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 软件
以下示例检查用户是否安装了至少版本为 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
问题
练习
检查你的答案。
教程:部署自包含应用程序
原文:
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="maintainer@example.com"/> <fx:bundleArgument arg="mac.CFBundleName" value="Java Tree Demo"/> <fx:bundleArgument arg="win.menuGroup" value="Java Demos"/> </fx:deploy> </target> </project>
使用以下信息设置 Ant 任务:
生成捆绑包
运行您在要为自包含应用程序构建捆绑包的平台上创建的打包任务。
对于动态树演示,请从项目的根目录运行以下命令:
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 任务的更多信息,请参阅JavaFX Ant Tasks,这些任务用于 Java 和 JavaFX 应用程序。
使用文件关联
原文:
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
文件中。 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 上运行。演示设置为使用一个包含所有平台信息的单个构建文件。请参阅为所有平台使用通用构建文件以获取更多信息。
Java 中文官方教程 2022 版(十三)(3)https://developer.aliyun.com/article/1486366