java.lang.InternalError: platform encoding not initialized when running EXE4J .exe w/ Java14 on PATH

java.lang.InternalError: platform encoding not initialized when running EXE4J .exe w/ Java14 on PATH

所以这个错误很奇怪...

我正在使用 EXE4J 6 为我的 JavaFX 应用程序构建一个 .exe 文件。这在 Java 版本 13.0.1 中没有任何问题。我最近升级了我的环境以使用 Java 14.0.1,现在每当我尝试通过 exe 运行 我的应用程序时,我都会得到以下堆栈跟踪:

java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.InternalError: platform encoding not initialized
at java.base/java.net.Inet6AddressImpl.getLocalHostName(Native Method)
at java.base/java.net.InetAddress.getLocalHost(Unknown Source)
at org.apache.logging.log4j.core.util.NetUtils.getLocalHostname(NetUtils.java:54)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:612)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:691)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:708)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:243)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:174)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:669)

尝试初始化我的 Log4J 日志记录时发生此错误。但是,如果我直接调用 InetAddress.getLocalHost(),我可以从 .exe 中复制此错误。 运行 我的应用程序直接从我的 Eclipse (EE 06/2020) 运行得很好。做了一些调试之后。我确定从我的 PATH 中删除 Java 允许应用程序 运行。我的 .exe4j 配置文件已设置,因此应用程序应寻找单独的 Java 14 jre,而不是尝试将我的 PATH 用于 java.

<searchSequence>
  <directory location="../java/jre64" />
</searchSequence>

jre64 是通过 ANT 使用我拥有的 14.0.1 jdk 构建的,并且只导入我需要的模块。同样,在我升级到 14.0.1

之前,这一切都通过 13.0.1 工作

通过在其他计算机上的研究和测试,我认为这归结为我计算机上的环境问题。但是我 运行 没地方找了。任何想法或想法将不胜感激。特别是为什么 EXE4J 会尝试在我的路径上使用 Java 而不是搜索序列中的那个。

其他注意事项:

我终于能够确定问题所在。

我使用的是与 Java 版本 10+ 不兼容的 Exe4J 6.0。我很惊讶在尝试 运行 exe4j 编译我的可执行文件时我没有遇到完全错误,但是 exe4j 似乎从我的注册表中吸取了旧的 1.8 java 版本并使用了 1.8 jdk 我从来没有从我的“C:/Program Files/Java”文件夹中清除过。当我删除所有旧 JDK 时,exe4j 开始抱怨缺少 Java VM(即使路径上设置了 14.0.1)。

升级到 Exe4J 7.0 解决了我的问题。

在我的例子中,问题是指向一个 jre 目录的 PATH 环境变量。

我在不同的目录中有 2 个应用程序:

应用程序 A 在 PATH 环境变量中包含一个 jre 目录并且工作正常。 应用程序 B 有另一个 jre 目录未包含在 PATH 环境变量中并抛出此错误。

从 PATH 环境变量中删除这个 jre 目录后一切正常。