【问题标题】:Create JavaFX executable including JRE and external libraries创建 JavaFX 可执行文件,包括 JRE 和外部库
【发布时间】:2015-09-10 07:07:56
【问题描述】:

我在 NetBeans 下开发了一个 JavaFX 应用程序,它需要 JRE8u60 和一些外部库(jar 和 dll)和一个“SQLite”数据库文件才能运行。我正在寻找一种方法来创建可执行文件或安装程序,其中包括(或安装)此版本的 JRE 和所需的库。

首先我尝试使用 NetBeans 原生打包程序,如 https://netbeans.org/kb/docs/java/native_pkg.html#fx 所示,但是当我运行获得的安装程序时,可执行文件说它找不到主类。我只是按照那个教程,所以我不知道我是否错过了适合我的特殊情况的一些必要点。我的 build.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Petra" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
<description>Builds, tests, and runs the project Petra.</description>
<import file="nbproject/build-impl.xml"/>
<target name="-post-jfx-deploy">
   <fx:deploy width="${javafx.run.width}" height="${javafx.run.height}" 
             nativeBundles="all"
             outdir="${basedir}/${dist.dir}" outfile="${application.title}">
      <fx:application name="${application.title}" mainClass="${javafx.main.class}"/>
      <fx:resources>
          <fx:fileset dir="${basedir}/${dist.dir}" includes="Petra.jar"/>
      </fx:resources>
      <fx:info title="${application.title}" vendor="${application.vendor}"/>
      <fx:platform basedir="C:\Program Files\Java\jdk1.8.0_60"/> 
  </fx:deploy>  
</target>
</project>

编译时输出似乎没有错:

ant -f C:\\Users\\jros\\Documents\\NetBeansProjects\\Petra jfx-rebuild
init:
deps-clean:
Updating property file: C:\Users\jros\Documents\NetBeansProjects\Petra\build\built-clean.properties
Deleting directory C:\Users\jros\Documents\NetBeansProjects\Petra\build
clean:
init:
deps-jar:
Created dir: C:\Users\jros\Documents\NetBeansProjects\Petra\build
Updating property file: C:\Users\jros\Documents\NetBeansProjects\Petra\build\built-jar.properties
Created dir: C:\Users\jros\Documents\NetBeansProjects\Petra\build\classes
Created dir: C:\Users\jros\Documents\NetBeansProjects\Petra\build\empty
Created dir: C:\Users\jros\Documents\NetBeansProjects\Petra\build\generated-sources\ap-source-output
Compiling 19 source files to C:\Users\jros\Documents\NetBeansProjects\Petra\build\classes
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Copying 26 files to C:\Users\jros\Documents\NetBeansProjects\Petra\build\classes
compile:
Created dir: C:\Users\jros\Documents\NetBeansProjects\Petra\dist
Copying 3 files to C:\Users\jros\Documents\NetBeansProjects\Petra\dist\lib
Detected JavaFX Ant API version 1.3
Launching <fx:jar> task from C:\Program Files\Java\jdk1.8.0_60\jre\..\lib\ant-javafx.jar
Launching <fx:deploy> task from C:\Program Files\Java\jdk1.8.0_60\jre\..\lib\ant-javafx.jar
No base JDK. Package will use system JRE.
RelativeFileSet{basedir:C:\Users\jros\Documents\NetBeansProjects\Petra\dist, files:[Petra.jar, lib\RXTXcomm.jar, lib\ojdbc6.jar, lib\sqlitejdbc-0.5.4.jar]}
No base JDK. Package will use system JRE.
Using base JDK at: C:\Program Files\Java\jdk1.8.0_60\jre
RelativeFileSet{basedir:C:\Users\jros\Documents\NetBeansProjects\Petra\dist, files:[Petra.jar]}
Using base JDK at: C:\Program Files\Java\jdk1.8.0_60\jre
Creating app bundle: Petra in C:\Users\jros\Documents\NetBeansProjects\Petra\dist\bundles
Result application bundle: C:\Users\jros\Documents\NetBeansProjects\Petra\dist\bundles
Installer (.exe) saved to: C:\Users\jros\Documents\NetBeansProjects\Petra\dist\bundles
RelativeFileSet{basedir:C:\Users\jros\Documents\NetBeansProjects\Petra\dist, files:[Petra.jar]}
jfx-deployment-script:
jfx-deployment:
jar:
jfx-rebuild:
BUILD SUCCESSFUL (total time: 3 minutes 31 seconds)

但是当我运行安装程序时,生成的“exe”会抛出这两个窗口:

这有什么线索吗??

【问题讨论】:

  • 你考虑过使用 gradle 作为你的构建工具吗? javafx 有一个 gradle 插件。看看hereherehere
  • 或者使用 maven java fx 插件,它有一些错误,但对构建/导出到 jar 有很大帮助

标签: java netbeans ant jar javafx


【解决方案1】:

我还没有找到将 JRE 直接放入可执行文件的方法,但这是一种至少将所有库放入 Jar(使用 Netbeans)以减少混乱的方法。您之前可能在 StackOverflow 上的其他地方看到过。

  1. 清理并构建您的程序。
  2. 打开文件

  1. 将此代码添加到 build.xml:

    <target name="package-for-store" depends="jar">
    
        <property name="store.jar.name" value="MyJarName"/>
    
        <!-- don't edit below this line -->
    
        <property name="store.dir" value="store"/>
        <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
    
        <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
    
        <delete dir="${store.dir}"/>
        <mkdir dir="${store.dir}"/>
    
        <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
            <zipgroupfileset dir="dist" includes="*.jar"/>
            <zipgroupfileset dir="dist/lib" includes="*.jar"/>
    
            <manifest>
                <attribute name="Main-Class" value="${main.class}"/>
            </manifest>
        </jar>
    
        <zip destfile="${store.jar}">
            <zipfileset src="${store.dir}/temp_final.jar"
            excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
        </zip>
    
        <delete file="${store.dir}/temp_final.jar"/>
    
    </target>
    

只需将 MyJarName 更改为您希望调用 Jar 文件的任何内容(不要使用 .jar 扩展名)。

  1. 右键单击 build.xml 并单击 Run Target 。

  1. 一切就绪。完整的 jar 将位于主项目文件夹中名为 store 的文件夹中。然后,您可以在 Launch4J 中将其打包为 .exe。

【讨论】:

  • 感谢您的方法,但生成的 jar 甚至无法启动:s 可能我必须添加 dll 库,不是吗?我是 Ant 新手
  • 您能否发布您的 build.xml 的屏幕截图,其中包含 package-for-store 代码?
  • 以上代码仅将“lib”文件夹的内容复制到最终jar中。如果您有任何其他依赖项,您也必须使用 &lt;zipgroupfileset dir="dist/OtherDependentLibraryName" includes="*.jar"/&gt; 之类的内容添加它们
  • 似乎这种方法不适用于 dll 的库 :( 无论如何,谢谢,它可能会在下一个项目中有所帮助;)
  • 这对 java fx 不起作用,因为 java fx 有自己的 ant 工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2013-08-08
  • 2013-05-07
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多