我有一个程序,我希望能够被任何用户轻松安装,我认为创建本机安装程序是最佳选择。我使用了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):
知道如何解决这个问题吗?
答案 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)
这里使用以下相同的问题:
我还通过重定向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