Java:如何从本机安装程序创建工作.exe?

时间:2014-08-14 15:13:57

标签: java netbeans installer exe

我有一个程序,我希望能够被任何用户轻松安装,我认为创建本机安装程序是最佳选择。我使用了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时,我在窗口弹出窗口中收到以下错误消息,其中包含无详细信息

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):右键单击Libraries>添加jar /文件夹
  • 在main方法中,实例化引用该库的对象。
  • 右键点击项目的名称>属性>部署>在项目菜单中启用本机打包操作
  • 右键点击您的项目>打包为> EXE安装程序
  • 构建完成后,转到创建安装程序的目录,然后启动安装程序。
  • 安装结束时,转到安装目录,然后启动.exe。应该发生错误。

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

3 个答案:

答案 0 :(得分:2)

我在本机打包的JavaFX应用程序中遇到了类似的问题,因为主要类的异常而导致"失败"错误。我的package.cfg与你的相同。

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

java -cp Project.jar org.project.Project

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

答案 1 :(得分:2)

这里使用以下相同的问题:

  • Java SE版本8更新31(版本1.8.0_31-b13)
  • NetBeans 8.0.2(补丁1)
  • Intel Core i7(64位)上的Windows 7 Enterprise SP1
  • Inno Setup Compiler 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>

第二个fileset指令强制从lib文件夹中获取jar依赖项的副本,该文件夹在部署为EXE或MSI时修复了所有内容。

答案 2 :(得分:0)

我认为你的主要类没有正确设置来打包。 您可以使用exe4J从您的jar文件中创建exe,而不是使用Netbeans。(请确保主要类是从 项目&gt;属性&gt;运行&gt;主类 <设置的/ p>

here

下载exe4J