【问题标题】:Java: how to create a working .exe from a native installer?Java:如何从本机安装程序创建工作 .exe?
【发布时间】:2014-08-14 15:13:56
【问题描述】:

我有一个程序,我希望任何用户都可以轻松安装,我认为创建一个本地安装程序是可行的方法。我使用了 Netbeans 8.0 的功能(项目属性 > 启用本机打包和打包为)。我能够创建一个有效的本机安装程序。安装后,我有以下文件树:

+-- Project
    \+-- app
         \+--lib (containing all the jars used by the project)
         \---Project.jar
         \---package.cfg
    \+--runtime
        \+--jre (contains the current jre)
    \---Project.exe

从 Project.jar 执行程序有效。但是,当我尝试启动 Project.exe 时,我在弹出窗口中收到以下错误消息,其中 no details 无论如何:

Failed due to exception from main class

为了确定问题的根源,我使用了基本的标准输出并将它们重定向到一个文件中,这要归功于 Windows 命令提示符。在第一次调用外部库之前,我得到了输出。所以看来库链接没有完成。但是,这是我的package.cfg 文件的内容:

app.mainjar=Project.jar
app.mainclass=project/Main
app.classpath=lib/firstlibrary.jar lib/secondlibrary.jar 

类路径已指定,但似乎无法识别。我尝试反转斜杠 (\) 并更改 ,; 的空格,但无济于事。

有一种简单的方法可以重现该错误(Netbeans 8.0 和 JDK 1.8u11):

  • 在 Netbeans 中创建一个新的 Java 项目
  • 链接任何外部库 (.jar):右键单击库 > 添加 jar/文件夹
  • 在 main 方法中,实例化一个引用该库的对象。
  • 右键单击项目名称 > 属性 > 部署 > 在项目菜单中启用本机打包操作
  • 右键单击您的项目>打包为> EXE安装程序
  • 构建后,转到已创建安装程序的目录,然后启动安装程序。
  • 安装结束后,进入安装目录,启动.exe。应该会发生错误。

知道如何解决这个问题吗?

【问题讨论】:

  • 能否提供库链接未完成的完整输出?
  • 输出对应于对 System.out.println() 的调用。由于没有关于错误消息的详细信息,我不得不以某种方式进行调试。显然,当您启动 exe 时,它​​不会在任何地方打印消息。因此,我使用> 运算符将标准输出重定向到一个文件中,并得到打印消息,直到实例化使用外部库的对象。
  • 谁能确认这个错误发生在他们的机器上?
  • 嗨@Koln,您能否解释一下您是如何做到这一点的“为了确定问题的根源,我使用了基本的标准输出并将它们重定向到一个文件中,这要归功于 Windows 命令提示符”。我在命令行中看不到任何内容,并且想跟踪类似的问题
  • @ZiglioNZ 前面的评论里都有解释。我添加了很多System.out.println(),我知道错误很有可能发生,通过终端启动我的exe并重定向输出。类似file.exe > mystacktrace.txt

标签: java netbeans installation exe


【解决方案1】:

我刚刚在原生打包的 JavaFX 应用程序中遇到了类似的问题,我收到“由于主类异常而失败”错误。我的 package.cfg 看起来和你的一样。

我所做的诊断只是从命令行手动运行 jar 文件(例如 Project.jar)并查看堆栈跟踪是什么,例如如果您的 Main 类在 org.project.Project 中

java -cp Project.jar org.project.Project

对我来说,我用来加载打包在 jar 中的各种文件(例如 JavaFX 的 FXML 文件)的 URL 导致了问题 - 我使用的是相对 URL(例如“./blah.ext”或“ ../foo.txt" 等),但是一旦我根据文件在 jar 中的布局方式将 URL 更改为绝对 URL,它就可以正常工作(例如“/org/project/blah.ext”和“/org /foo.txt")。

【讨论】:

    【解决方案2】:

    同样的问题,使用这些:

    • Java SE 版本 8 更新 31(内部版本 1.8.0_31-b13)
    • NetBeans 8.0.2(补丁 1)
    • 基于 Intel Core i7(64 位)的 Windows 7 Enterprise SP1
    • Inno 设置编译器 5.5.5 (u) - Unicode

    我还通过重定向 printlns 来跟踪输出,它在第一次调用外部库时就崩溃了。我想也许我和 matt1 有同样的问题,所以我修复了所有的相对路径,但没有快乐。我终于发现安装程序没有使用外部 jar 文件创建 /app/lib 文件夹。手动将 lib 文件夹复制到目标安装文件夹后,它工作正常,即使在没有安装 JRE 的机器上(我正在开发一个独立的应用程序)。

    解决方法是在 build.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="*.jar"/>
              <!--below is the magic bit that copies all the dependency jar files to the native package output-->
              <fx:fileset dir="${basedir}/${dist.dir}" includes="lib/*.jar"/>
          </fx:resources>
          <fx:info title="MyApp" vendor="MyVendor"/>
      </fx:deploy>          
    </target>
    

    第二个文件集指令强制从 lib 文件夹复制 jar 依赖项,这在部署为 EXE 或 MSI 时修复了所有问题。

    【讨论】:

    • 嗨@TxF,您能否解释一下您是如何做到这一点的“我还通过重定向 printlns 来跟踪输出?谢谢!
    • 我明白了,只需要从命令行调用重定向>,它只输出到一个文件,这有点不方便。我也看不到任何异常堆栈跟踪,也许我需要以某种方式重定向stderr
    • 是的,但总比一无所获要好。 :) 你总是可以做一个“e.printStackTrace();”在将输出推送到标准输出的 catch 块中,最终应该在重定向文件中(如果需要,您可以强制出现错误条件)。
    • 谢谢,我发现了如何打印异常堆栈跟踪:>executable /Debug
    【解决方案3】:

    我认为您的 主类未正确设置 以打包。 您可以使用 exe4J 从 jar 文件中生成 exe,而不是使用 Netbeans。(请确保从 project > properties > run > main class

    设置主类

    here下载exe4J

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多