1

嗨,我正在 javafx 2.2 中创建一个应用程序,在编译本机包 (EXE) 时,我可以看到在运行时我错过了我需要的库。

MyApp\runtime\jre\lib\ext\sunjce_provider.jar

我尝试在我的 build.xml 中添加它

<fx:deploy width="${javafx.run.width}" height="${javafx.run.height}"
            nativebundles="exe"
           outdir="${basedir}/${dist.dir}" outfile="${application.title}">
    <fx:application name="${application.title}" mainClass="${javafx.main.class}"/>
    <fx:resources>

        ...

        <fx:fileset dir="${platform.home}/jre/lib/ext" includes="sunjce_provider.jar"
                type="data"/>

    </fx:resources>
    <fx:info title="${application.title}" vendor="${application.vendor}"/>
</fx:deploy>

但这只会让它在

MyApp\app\sunjce_provider.jar

有没有办法做到这一点?

4

1 回答 1

4

包括应用程序库

本节展示如何包含您的应用程序所依赖的标准 jar。

JavaFX ant 任务参考中的示例 build.xml 片段,关键行是<fx:fileset dir="dist" includes="lib/*.jar"/>

<!-- Expect definition of JavaFX ant tasks is already imported -->

<fx:jar destfile="dist/application.jar">
    <!-- Details about application -->
    <fx:application name="Sample JavaFX application"
            mainClass="test.MyApplication"/>

    <!-- Define what auxilary resources are needed -->
    <fx:resources>
        <fx:fileset dir="dist" includes="lib/*.jar"/>
    </fx:resources>

    <!-- What to include into result jar file?
         Everything in the build tree -->
    <fileset dir="build/classes"/>

    <!-- Customize jar manifest (optional) -->
    <manifest>
        <attribute name="Implementation-Vendor" value="Samples Team"/>
        <attribute name="Implementation-Version" value="1.0"/>
    </manifest>
</fx:jar>   

修改 JRE 组件

本节向您展示如何定制与您的应用程序捆绑在一起的 Java 运行时组件。

请参阅Java 部署博客,了解在本机打包中包含 sun jce 提供程序(有问题指出:jre 中的 sunjce_provider.jar 用于独立 javafx 应用程序)。

相关部分(从博客条目复制和粘贴)是:

如果您使用打包工具来生成可安装的包,则可能需要在将应用程序映像打包到安装程序之前对其进行调整。为什么?例如,您可能想要签署应用程序,因此它似乎不受操作系统的信任(例如,为了取悦 Mac OS X Gatekeeper)。

此外,默认情况下,自包含应用程序不包含 Java 运行时的完整副本。我们只包括一组强制性组件。采用这种方法的部分原因是我们希望减小封装尺寸。但是,在某些情况下,您的应用程序可能依赖于这些可选组件,在这种情况下,您需要一种将它们添加到私有运行时的方法。例如,如果缺少 jre/lib/ext/sunjce_provider.jar,则 https 连接将不起作用。

目前,这可以通过提供在填充应用程序映像后执行的自定义配置脚本来实现。与上面带有图标的示例一样,您需要启用详细输出以查找脚本文件的名称,然后将其拖放到打包工具可以找到它的位置。请注意,脚本语言也是特定于平台的。目前我们只支持 Mac/Linux 的 shell 和 windows 上的 Windows Script。

您如何找出应用程序图像的位置?当前自定义脚本在存储配置文件的目录中运行,但可以使用相对平台特定路径访问应用程序映像。您可以从详细输出或通过将环境变量 JAVAFX_ANT_DEBUG 设置为 true 来获取此路径以保留中间构建工件。

这是示例脚本(由 John Petersen 提供),您可以使用该脚本将 jre/lib/ext/sunjce_provider.jar 添加到 Windows 平台上 MyApp 的应用程序包中。使用 Javascript 编写脚本,但您也可以使用 VBScript 编写 Windows 脚本。

<?xml version="1.0" ?>  
<package>  
   <job id="postImage">  
    <script language="JScript">  
     <![CDATA[  
        var oFSO = new ActiveXObject("Scripting.FileSystemObject");  
        var oFolder = oFSO.getFolder(".");  
        var from = oFolder.path + "\\MyApp\\app\\sunjce_provider.jar";  
        var to = oFolder.path + "\\MyApp\\runtime\\jre\\lib\\ext";  
        if (!oFSO.FolderExists(to)) {  
          oFSO.CreateFolder(to);  
        }  
        to += "\\";  
        oFSO.CopyFile(from, to);  
     ]]>  
    </script>  
   </job>  
</package> 
于 2013-08-14T20:33:48.810 回答