首页 > 解决方案 > 我来自 launch4j 的 .exe 文件不像我的 java 文件那样工作。我错过了什么吗?

问题描述

作为 Java 新手并使用代码捆绑程序,我能够成功地获得运行一个简单的新 HelloWorld java 文件的正确输出。因此,我相信 java 文件在将其编译为类文件或之后运行它方面没有问题,并且我拥有 java 工具包中创建可执行文件所需的所有文件。但是,我不确定我是否正确使用launch4j来获取.exe,无论是设置.jar还是通过制作正确的.xml文件的过程。

下面的代码显示了当我尝试将所有内容放入 .jar 文件时得到的结果,但我猜输出是错误的,因为除非我从“cvfm”中取出“m”,否则不会生成新的 .jar 文件在 jar 命令中。代码确实显示了有关添加清单的内容,无论何时添加,但我仍然没有得到正确的应用程序。在没有 launch4j 的情况下获得正确的输出后,我停止重新创建 .java 和 .class 文件,并且在重新创建 .jar 文件时只关注 .xml 没有任何区别。我已经尝试在launch4j中将JRE选项卡中的环境变量留空,或者只是在命令提示符中包含Java文件正确使用的系统变量的相同路径,并且我还在标题中将GUI的检查切换到控制台标签。

C:\JavaTest>jar cvfm HelloWorld.jar HelloWorld.class
java.io.IOException: invalid header field
        at java.util.jar.Attributes.read(Attributes.java:406)
        at java.util.jar.Manifest.read(Manifest.java:234)
        at java.util.jar.Manifest.<init>(Manifest.java:81)
        at java.util.jar.Manifest.<init>(Manifest.java:73)
        at sun.tools.jar.Main.run(Main.java:176)
        at sun.tools.jar.Main.main(Main.java:1288)

C:\JavaTest>jar cvf HelloWorld.jar HelloWorld.class
added manifest
adding: HelloWorld.class(in = 426) (out= 289)(deflated 32%)

在测试包装器时,我总是收到有关签名的警告,但我认为这不像实际错误那样是一个问题。由于众多组合的性质,很难跟踪导致问题差异的原因,但似乎现在将 JRE 选项卡留空,除了具有最小 JRE 版本会产生错误“无主清单属性”正确来自launch4j中的包装器测试。将系统变量路径的最后包含在环境变量字段中会做同样的事情。在尝试重新创建 .jar 之前,将标头切换到控制台将创建一个没有错误的 .exe,但是打开应用程序要么什么都不做,要么在命令提示符下输入相同的“无主清单属性”输出。现在我能' t 甚至使用 launch4j 来测试在控制台上具有标头的包装器,即使在构建它们时不会产生错误(但在打开 .exe 时会发生同样的错误)。我只是想获取从 launch4j 生成的 .exe,以便在命令提示符中提供与在此处键入“java HelloWorld”时得到的相同的输出。

如果我确实正确创建了 .jar 并正确使用了 launch4j,我是否错过了需要某种清单文件才能使用 launch4j 的未列出步骤?如果是这样,我将如何确保我得到它正确?它会在 bin 文件夹中看到还是与 JDK 完全分开?我需要将它移动到 java/class/jar/exe 文件所在的 JavaTest 文件夹吗?任何帮助都非常感谢。

标签: javajarenvironment-variablesexelaunch4j

解决方案


中的“m”jar cvfm代表清单,并暗示您将提供一个文件作为清单的参数。f 代表:您将指定文件名。

所以,HelloWorld.jar是 fHelloWorld.class的论据,是 m 的论据。显然,您的类文件不是有效的清单文件,因此会发生错误。

一般来说,使用构建工具来制作jar,例如maven或gradle。您需要一个清单才能拥有 Main-Class 属性,并且您需要 Main-Class 属性来创建可运行的 jar,并且您需要一个可运行的 jar 来启动 4j-ify 它。

创建一个名为 MANIFEST.MF 的文件。使用纯文本编辑器创建它。它应该包含:

Main-Class: com.foo.thisIsAPackage.YourMainClass

没有别的了。

然后:

jar cvfm HelloWorld.jar MANIFEST.MF YourMainClass.class

请注意,我很确定您必须有一个包裹,否则这将不起作用。


推荐阅读