java - 如何将 .jar 文件添加到 native 包?

标签 java ant javafx-2

您好,我正在 javafx 2.2 中创建一个应用程序,在编译 native 包 (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

有没有办法做到这一点?

最佳答案

包括 App 库

本节介绍如何包含您的应用程序所依赖的标准 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 Deployment blog on including the sun jce provider in native packaging (问题中注明:sunjce_provider.jar in jre for standalone javafx application)。

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

如果您使用打包工具来生成可安装包,则可能需要在将应用程序镜像打包到安装程序之前对其进行调整。为什么?例如,您可能希望对应用程序进行签名,这样它就不会显得不受操作系统信任(例如取悦 Mac OS X Gatekeeper)。

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

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

如何找到应用程序图像所在的位置?当前自定义脚本在存储配置文件的目录中运行,但可以使用相对平台特定路径访问应用程序图像。您可以从详细输出或通过将环境变量 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> 

关于java - 如何将 .jar 文件添加到 native 包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241130/

相关文章:

Java SWT - 从一个图像溶解(淡化)到下一个图像

java - 从 String[] 中删除重复项

grails - 使用grails ant创建zip时重命名文件

java - 科贝图拉 + 朱尼特

java - 在 CSS 中访问 Java 类变量

javafx - 如何使 Textarea 垂直滚动条始终处于事件状态?

java - 从 tomcat 取消部署 Web 应用程序不会删除已部署的目录

android - Cordova,在 Ubuntu 14.04 上添加 android 平台时出错

java - 动画矩形形状鼠标点击的距离

java - SmartGWT 无法与 Maven 和 Jetty Chrome Ubuntu x64 一起使用