当前位置: 首页 > 知识库问答 >
问题:

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

弓晔
2023-03-14

有一些最初的问题与我的javac.exe不与其他的软件能够编译和运行的代码但我能够得到一个. class和. java的程序所以我想我可以使用启动4j仍然创建应用程序,使其自身正常执行。但是,我不知道为什么产生的. exe没有提供我期望的输出。

我使用了一个您可能知道的指南来学习测试“HelloWorld”程序,因为我是java新手,并将实际代码转换为应用程序。按照这些步骤,我能够开始测试javac。exe文件,我发现我的JDK版本并没有正确安装。我从这里学到了如何检查javac。exe存在,并且java版本的文件夹会以某种方式覆盖javac版本的类似文件夹。exe时安装(但我无法找到如何下载和安装没有发生这种情况)。所以我决定只安装最新版本的JDK。我检查了一下,发现有一个javac。exe文件位于单独的文件夹中,但更新似乎没有覆盖以前的版本。按照指南,我能够检查所有内容,但最终的输出产生了一个错误,即编译java与运行时不匹配。我想用javac复制更新的java版本。exe位于运行时的同一路径中[较新版本的java文件夹位于程序文件中,如指南所示,但原始版本的java文件夹位于程序文件(x86)中,我必须相应地调整环境变量路径],但这并不能解决任何问题。因为我了解到Launch4j可以将这些步骤与各种版本捆绑在一起,所以我想看看是否可以将所有内容都打包到一个exe文件中。我能够生成一个没有输出的文件。看这里,有人说他们可以通过在“header”选项卡上勾选“console”而不是“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工具包,但奇怪的是它被列为更新),我觉得我将失去与Java C不同的部分。exe,因为命令提示符并不完全指向版本11。感谢您的帮助。

编辑:为了澄清我是如何修改系统变量的,JAVA_HOME最初的值为“C:\Program Files(x86)\JAVA\jre1.8.0_201”,而bin文件夹缺少“javac.exe”;在安装了最新的JDK之后,我尝试了“C:\Program Files\Java\JDK-11.0.2”和“C:\Program Files(x86)\Java\JDK-11.0.2”将“JDK-11.0.2”文件夹复制到与程序文件(x86)中先前版本相同的位置,但在输入“Java-version”时,命令提示符仍然输出旧版本;当我从本地驱动器的JavaTest文件夹输入“javahelloworld”时,也会产生相同的错误。“Path”变量始终以“Program Files(x86)\Common Files\Oracle\Java…”开头我在“%JAVA\u HOME%\bin”中编辑了它,我对语法很有信心。有了这个,我看不出在最新的JDK中怎么会找不到任何东西,包括命令提示符中的初始版本检查,特别是当echo%PATH%命令确实根据命令提示符中的输出指向最新的“JDK-11.0.2”版本时。

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

共有1个答案

景昊焜
2023-03-14

检查路径,可以检查环境变量或在windows命令提示符(CMD)中运行

echo %PATH%

您应该只指向一个JAVA版本,我想您指向的是Java1.8.0_201和来自另一个JAVA(可能是Java11?)的javac。

我想您在JDK11中看到了javac,但在JRE8中没有看到javac。如果您想使用Java8,请下载JDKforJava8并指向它。

如果您想要java 11,请删除路径中指向java 8的链接

 类似资料:
  • Java在k:\test\jre7\bin\Java.exe中,我的jar是k:\test\pllsolver-0.2alpha.jar 此外,我还不知道这是否会成为一个问题,但可执行文件和数据/需要在同一个目录中。我计划稍后做更好的pathing,但我对Windows ENV变量没有一个清晰的理解。

  • Launch4j的设置似乎很简单,但是在生成exe之后,它就不能从其他位置运行了。 谢了,尚卡尔。

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

  • 但是,当我将exe文件复制到其他地方并运行它时,我会得到错误消息。 我在SO上搜索,发现了以下问题,但无法使我的应用程序与那里给出的建议工作。 如何将JRE绑定到Java应用程序的EXE中?Launch4j表示“运行时丢失或损坏”。 如有任何帮助,将不胜感激。

  • 问题内容: 可以在本地运行JAR文件。下一步是在另一台PC上运行它。 问题是运行JAR文件是否需要JRE,JDK或两者都需要? 问题答案: JDK包含JRE。 大多数程序仅需要JRE(Java运行时环境),但是某些程序在运行时需要编译器,在这种情况下,您需要JDK。 如果您拥有JDK,则也不需要JRE。

  • 我能够成功地从一个可执行JAR创建一个.exe文件。从Launch4j中,我可以测试包装器,日志上的输出就是我所期望的。但是,如果我尝试从命令行或Windows资源管理器运行exe,则不会发生任何情况。没有错误,没有输出到控制台。该程序还应该编辑一个文本文件,当我使用批处理文件运行jar时会发生这种情况,但当我运行EXE时不会发生这种情况。这都在同一台计算机上,所以我怀疑这是JRE的问题。我对St