我有一个公开可用的Java8桌面应用程序与MSI安装程序,我想更新到Java17完成。
当前的用户体验是这样的:
1.用户下载MSI安装程序并运行它
- MSI安装程序检查兼容的Java 8 VM,如果不存在,则提示用户从http://java.com安装一个。
1.用户启动application.exe
,这是一个基本上运行java jar application.jar
的填充程序。
我很难理解的是,在Java 9+的世界里,用户应该安装什么。例如,如果我将用户发送到:https://www.oracle.com/java/technologies/downloads/他们会下载Java开发工具包,这对用户来说是一个安装起来很混乱的东西(“这样对吗?我不想开发东西??”)。
此外,当你登陆http://java.com时,它会说“如果你被要求下载java,很可能是这个”,这意味着如果你发布应用程序,你应该要么使用Java 8(忘记JavaFX灾难,即OpenJDK 11之前的版本,而只是使用Orcale Java)...
我的印象是,在Java 9之后,Jigsaw的承诺是构建一个包含本机运行时和jar的包,所有这些都整齐地捆绑在一起,这样最终用户必须安装JVM的日子就结束了。然而,在网上搜索时,我发现Gradle或IntelliJ(或Eclipse)都不支持这一点,所以这似乎有点像一个死了的白日梦?
如果我想发布Java 17应用程序,用户是否需要安装JDK?如果不需要,我应该如何打包和发布我的应用程序?
2条答案
按热度按时间4jb9z9bj1#
甲骨文的观点:
C:\Program Files\JavaSoft
等已知位置找到它的概念已经过时。你不这样做,JVM只适用于该应用。那个应用程序知道在哪里可以找到它,而系统上的其他任何东西都不知道。每个基于Java的应用程序都有自己的JVM副本(树摇动与否),只有它自己使用。jusched.exe
或任何其他工具来确保它保持最新。一个简单的替代方案是,你只需将拥有一个可以运行你的应用程序的java运行时的责任转移到用户的肩上。(因为JDK可以运行Java应用程序,实际上比JRE更好),告诉他们确保它在
$PATH
上或在已知位置/告诉您在哪里可以找到它/设置JAVA_HOME
,并且 * 他们 * 负责保持它最新。其他供应商的观点:
jusched.exe
或其他更新机制,以及这些JRE如何(甚至 * 如果 *)注册它们的存在,以便您的应用/安装程序可以确定它们的位置。您必须进行调查。您不需要对JVM进行树型改造,您也可以随应用提供一个完整的JDK。例如,如果您的安装程序最终执行以下操作:
C:\Program Files\EmilysAwesomeGame
ROOT\jdk
。ROOT\lib
中。ROOT\emilygame.jar
中%~dp0\jdk\home\bin\java -jar %~dp0\emilygame.jar
的.BAT
文件,并且该jar具有一个MANIFEST,其中Class-Path
条目包含例如lib\javafx.jar lib\someotherdep.jar
,然后..这将工作得很好,并且将该bat文件替换为执行相同操作的exe也工作得很好(并且“在子目录中运送您自己的JVM”是像launch 4j和类似工具已经支持很长时间的模型)。不使用树型结构的缺点是JDK太大了,包含了各种各样你不会用到的东西。但是,这只是节省磁盘空间的问题,一个不使用树型结构的JDK不会运行得更慢,那些不用的部分最终将永远不会被加载。
一个非常常见的“部署模型”是,你为windows-x86提供一个带有exe的msi,告诉其他人自己负责安装JDK,并为其他人(linux用户、mac用户、windows-aarch 64等)提供普通的jar。
owfi6suc2#
这个问题被问了一遍又一遍。因此,有一个广泛的讨论这个主题在这里的SO。见:https://stackoverflow.com/tags/javafx/info与您最相关的部分是关于“ Package ”的部分。