java - 我是否跳过了JRE和Launch4j中的必要步骤,导致exe文件失败?

标签 java environment-variables exe command-prompt launch4j

我的javac.exe最初存在一些问题,无法与软件的其余部分一起使用,从而无法编译和运行代码,但是我能够为该程序获取.class和.java,因此我认为我可以使用Launch4j仍然创建应用程序以自行正常执行。但是,我不知道为什么生成的.exe没有提供我期望的输出。

我使用了您可能知道的指南来学习测试“ HelloWorld”程序,因为我是java的新手,并将实际代码转换为应用程序。按照这些步骤,我可以开始测试javac.exe文件,我发现JDK版本以某种方式无法正确安装该文件。我从这里了解到是否存在javac.exe,并且以Java版本的文件夹在安装时以某种方式覆盖了与javac.exe相似的文件夹(但在这种情况下我无法找到如何下载和安装) 。因此,我决定只安装最新版本的JDK。我检查了一下,在一个单独的文件夹中有一个javac.exe文件,但是更新似乎并未覆盖以前的版本。遵循指南,我能够检查所有内容,但最终输出产生了关于编译java与运行时不匹配的错误。我想到了将带有javac.exe的较新Java版本复制到运行时的同一路径中[较新版本的Java文件夹位于Program Files中,就像指南一样,但原始版本的Java文件夹位于Program Files中。 (x86),我必须据此调整环境变量路径],但这并不能解决任何问题。
由于我了解到Launch4j可以将步骤与各种版本捆绑在一起,因此我想到了是否可以将所有文件包装成一个exe文件。我能够产生一个没有输出的文件。在这里,有人说他们可以通过在“标题”选项卡而不是“ GUI”上选中“控制台”来解决问题,但是使用新的exe文件对我唯一起作用的是打开命令提示符,没有显示任何内容。我不确定要在命令提示符下检查什么,或者是否应该知道它与以前一样是同样的问题。也许Launch4j可以按原样工作,但我只是不知道在环境变量中放什么(我想我可以在JRE选项卡中没有正确输入的情况下获取exe,因为这次我没有指南)?即使命令提示符似乎在那里,我是否也应该卸载以前的版本?如果这样做,是否还会丢失其他内容?

C:\Users\User>java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) Client VM (build 25.201-b09, mixed mode)

C:\Users\User>javac -version
javac 11.0.2

C:\Users\User>cd C:\JavaTest

C:\JavaTest>java HelloWorld
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError:  HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

C:\JavaTest>

C:\JavaTest>dir
 Volume in drive C has no label.
 Volume Serial Number is 68EF-F43A

 Directory of C:\JavaTest

01/28/2019  12:46 AM    <DIR>          .
01/28/2019  12:46 AM    <DIR>          ..
01/31/2019  12:56 AM               426 HelloWorld.class
01/27/2019  10:41 PM            25,839 HelloWorld.exe
01/25/2019  12:55 AM               751 HelloWorld.jar
01/22/2019  12:29 AM               114 HelloWorld.java
01/25/2019  01:07 AM               798 HelloWorldconverttoexe.xml
01/27/2019  10:41 PM               802 HelloWorldconverttoexe2.xml
01/25/2019  01:09 AM             1,146 launch4j.log
01/28/2019  12:46 AM             5,102 questiontostackoverflow.txt
               8 File(s)         34,978 bytes
               2 Dir(s)  561,260,572,672 bytes free

C:\JavaTest>


尽管输出显示JNI错误,并且版本检查不匹配,但我认为我可以手动获得正确的输出。如果不起作用,我希望使用Launch4j创建exe文件时会出现“ HelloWorld”消息(这就是程序代码的意思),但是两次尝试均导致打开应用程序时无输出(第一次甚至没有打开命令提示符,但第二次在关闭它之前做了短暂的操作)。实际的软件似乎没有问题,程序代码当然也没有问题,但是编译后运行代码的过程似乎没有问题,而且我认为无论Launch4j的变量如何,这种情况都会继续存在。我觉得将程序文件夹“ JavaTest”分开并直接在本地驱动器中是没有害处的,因为这些指南都没有给我任何担心的理由。我觉得如果我进行其他任何更改,都会使问题变得更糟。具体来说,如果我卸载Java 8版本(即使我确定我从Oracle那里获得了整个JD套件,也很奇怪地列为更新),我会觉得我将失去与javac.exe不同的部分,作为命令提示符不能完全将版本11的所有内容都直接指向。任何帮助表示赞赏。

编辑:为了阐明我如何修改系统变量,JAVA_HOME最初的值为“ C:\ Program Files(x86)\ Java \ jre1.8.0_201”,而bin文件夹缺少“ javac.exe”;安装最新的JDK后,我在复制“ jdk-11.0”时尝试了“ C:\ Program Files \ Java \ jdk-11.0.2”和“ C:\ Program Files(x86)\ Java \ jdk-11.0.2” .2“文件夹与Program Files(x86)中先前版本的位置相同,但是当我输入” java -version“时命令提示符仍输出较旧版本;当我从本地驱动器的JavaTest文件夹中输入“ java HelloWorld”时,会产生相同的错误。 “ Path”变量始终以“ Program Files(x86)\ Common Files \ Oracle \ Java ...”开头,我对语法充满信心,并在“%JAVA_HOME%\ bin”中对其进行了编辑。这样,我看不到如何无法在最新的JDK中找到所有内容,包括在命令提示符下进行初始版本检查,尤其是当echo%PATH%命令确实确实指向最新的“ jdk-11.0”时.2“版本基于命令提示符中的输出。

EDIT2:我不确定使用更新功能自动还是手动更新到11是否会阻止控制面板上的Java系统像现在一样仅识别Java 8版本,即使安装了Java 11也是如此。直接下载后,我就可以使用控制面板配置了。在用户方面,当我取消选中已启用的Java 8的路径并使用javaw.exe或整个文件夹从程序文件和(x86)添加Java 11路径时,命令提示符将给出相同的结果。系统选项卡甚至不允许我添加Java 11版本的路径,但允许我取消选中启用Java 8版本的选择(这仍然没有区别)。
我发现指南中的情况与我有其他一些不同,尽管我不知道这是否重要。该指南的用户环境变量似乎仍然在路径中包含Java,但是对我来说,唯一的指导是编辑系统变量以转到Java路径。指南中“ dir”的输出显示了所有具有相同日期的内容,而命令提示符中的“ dir”仅显示了“ HelloWorld.class”文件的日期更新(我已经在问题的代码部分的结尾),这可能很有意义,因为我知道较旧的launch4j尝试将不会受到影响。
我对Java 8没问题,但是如果卸载所有程序并重新安装Java 8都没有得到javac.exe文件,则只能将Java 11的javac.exe文件移动到Java 8 jre文件夹的bin文件夹中(重置后Java 8的路径并找到一种方法来摆脱Java 11的其余部分)?

最佳答案

检查您的PATH,可以检查环境变量或在Windows命令提示符(CMD)中运行

echo %PATH%


您应该只指向一个JAVA版本,我想您指向的是Java 1.8.0_201并指向另一个Java的javac(也许是Java 11?)。

我想您在JDK11中看到了javac,但是在JRE8中却没有看到javac。
如果要使用Java 8,请下载Java 8的JDK并指向它。

如果您需要Java 11,请在PATH中删除指向Java 8的链接

关于java - 我是否跳过了JRE和Launch4j中的必要步骤,导致exe文件失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54396212/

相关文章:

bash - 如何更改 Git 命令行界面的语言?

c# - 检测单个 Windows 进程退出事件 C#

javascript - JSNI 脚本失败,但在 Chrome Devtools 控制台中运行时脚本成功

reactjs - 如何使用自定义 webpack 在 React 上设置环境变量

node.js - 如何在 Dockerfile 中设置 ENV 变量(来自 .txt 文件的内容)?

windows - Windows 11 支持的操作系统 GUID 是什么?

python - cx_Freeze 导入错误 : cannot import name

Java "new File()"不创建文件

java - 加载制表器时 RStudio 发生 fatal error

java - Kotlin 中的注释不起作用