我使用的是 Windows 10,并且安装了 Java 17,且
JAVA_HOME
设置正确。 java --version
给出了这个:
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode, sharing)
在 Maven 父 POM 中,我通过
launch4j-maven-plugin
2.1.1 配置了 Launch4j,以使用我当前的 JRE 生成 EXE:
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>generate-exe</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
...
<jre>
<minVersion>${maven.compiler.release}</minVersion>
</jre>
...
这个父 POM 还指定了 Java 8(尽管它需要 Java 9+ 来构建):
<properties>
<maven.compiler.release>8</maven.compiler.release>
...
我的 CLI 项目 POM 使用上面的父 POM。我构建 Maven 项目没有任何问题,并且它生成了
my-cli.exe
。我可以跑my-cli.exe
很好。
但我想在 My CLI 中使用 Java 17,这应该没问题,因为我安装了 Java 17。所以我在 My ClI 项目中设置了以下内容:
<properties>
<maven.compiler.release>17</maven.compiler.release>
...
我清理并重建项目,它像以前一样输出
my-cli.exe
。但是当我尝试运行 my-cli.exe
时,它会打印:
My CLI: This application requires a Java Runtime Environment 17
然后它会打开我的浏览器到
https://java.com/en/download/
。
从 Launch4J Bug 197 来看,Launch4J 似乎并不查看
JAVA_HOME
环境变量,而是查看 Windows 注册表。这意味着它会忽略任何手动安装的 JDK。 😞 所以我去了 Adoptium 并使用安装程序安装了最新版本 OpenJDK17U-jdk_x64_windows_hotspot_17.0.2_8.msi
。在我的 Windows 安装程序中,它显示“Eclipse Temurin JDK with Hotspot 17.0.2+8 (x64)。不幸的是,同样的事情发生了;Launch4J 仍然无法识别它。
为什么 Launch4J 无法识别 OpenJDK 17.0.2+8 是“Java 运行时环境 17”?
<path>
元素描述了解决方案:
...可以使用 JAVA_HOME 或 PATH 用于搜索已安装的运行时的环境变量 无需添加用于搜索 JRE 的注册表项。
因此只需将
path
元素添加到您的 launch4j-maven-plugin
配置中即可:
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
...
<configuration>
...
<jre>
<path>%JAVA_HOME%;%PATH%</path>
显然根据Launch4J 功能请求 103,Launch4J 不会查看 OpenJDK 使用的相同注册表项,并且仅适用于 Oracle JDK 注册表项。有一个 Adoptium Issue 64 要求 Adoptium 使用与 Oracle 相同的注册表项,但看起来由于陷阱而被放弃。
如上面的功能请求中所述,Launch4J 无论如何都应该查看
JAVA_HOME
环境。在对 Launch4J Bug 197 进行更广泛的讨论之后,我发现现在可以指定搜索路径以包含 %JAVA_HOME%
,使用类似的内容,如 Ilya 的答案中所述:
<jre>
<path>%JAVA_HOME%;%PATH%</path>
</jre>
如果没有找到 JDK,也可以将启动的 URL 更改为更有用的内容,或者(可能更适合 CLI 程序)将其完全删除。请阅读 Launch4J Bug 197 了解更多详细信息。
我遇到了类似的问题(maven 插件版本 2.5,Java17/Liberica Bellsoft),无法找到 JRE - 虽然它就在那里 -。
最后使用
--l4j-debug-all
选项,我看到找到了JRE目录,但未正确检测到java的-version
输出。
作为解决方法,我禁用了位级别和版本
<jre>
<path>${project.jre.version}</path>
<!--requires64Bit>true</requires64Bit-->
<!--minVersion>17.0.10</minVersion-->
<requiresJdk>false</requiresJdk>
</jre>