jvm 构建轻量级Java本机程序

eqzww0vc  于 11个月前  发布在  Java
关注(0)|答案(3)|浏览(84)

所以我开始用Netbeans在Java中开发原生程序,用Inno Script为它们创建安装脚本。但后来我注意到,即使是基本的程序也往往是相当重的资源,这是因为每个程序都有自己的Java虚拟机运行时副本,需要它来执行。我认为一个很好的解决方案是将JVM运行时安装到一个统一的文件夹中(因为它们不只是复制到每个程序中的相同文件吗?),然后每个单独的程序可以从该共享文件运行共享文件。
问题是我真的不知道该怎么做我应该把运行时安装到哪里,如何设置这个路径,以便在计算机上运行的任何原生Java程序都能自动检测和使用它们?将共享目录添加到%PATH%环境是否足够?
请帮帮我任何帮助将不胜感激。
我还没有真正尝试任何东西,因为我觉得也许我应该先得到一些建议。
:更新:所以,我想我已经找到了一个可能的解决方案,虽然我还没有尝试,因为我不能访问我的IDE和其他工具,直到明天晚些时候。但我想的是,也许我可以将共享的Java虚拟机运行时安装到一个目录,然后将该目录添加到%PATH%环境变量中,这样它的运行时就可以像系统DLL一样执行。我会尽快发布最新的理论结果。

z5btuh9x

z5btuh9x1#

为您的操作系统使用OpenJDK的默认安装程序,如果安装程序不这样做,只需将JAVA HOME目录的bin目录添加到PATH环境变量中即可。

6g8kf2rb

6g8kf2rb2#

如果你的最高优先级是一个小的可执行文件,Java是不合适的。您应该使用一种语言,该语言旨在编译为具有最小可执行文件的简单本机可执行文件。例如,Swift、Rust和C。
如果你想继续使用Java,同时最小化软件工件的大小,那么:

  1. Modularize您的应用程序与Java Platform Module System (JPMS)
    1.使用jlink工具将一组模块及其依赖项组装并优化为自定义运行时映像。与其引入JVM提供的整个类集合,而只包含特定应用实际使用的模块类。
    1.使用jpackage工具将Java应用程序打包到特定于平台的包中。支持的特定于平台的包格式有... Linux:deb和rpm,macOS:pkg和dmg,Windows:msi和exe。
    如果优先考虑启动时间的速度,请考虑使用带有OpenJ9而不是HotSpot的JVM。
    如果优先考虑执行速度,请使用GraalVM技术提前编译Java应用程序。
    你说:
    我认为一个好的解决方案是将JVM运行时安装到一个统一文件夹中
    您可以假设用户的计算机上已经安装了JRE或JDK。那么您就不需要在软件工件中包含任何Java运行时。
    显然,只有当(a)您的用户群正在使用托管计算机,例如在企业或教育环境中,或(b)您的用户足够渴望和精明地获得并自行安装JRE/JDK时,这才是可行的。
    在Java的早期,Sun Microsystems能够说服大多数个人计算机行业在他们的计算机上捆绑JRE。但这种做法多年前就结束了。
nkoocmlb

nkoocmlb3#

我现在找到了解决问题的办法。
我尝试了我最初的理论,但它没有工作,因为原来原生Java程序(或者至少是那些在Netbeans下使用Java FX编译的程序)是硬连接在特定文件夹中搜索JVM运行时的,并且这个文件夹定义在一个简单的、基于文本的配置文件中。因此,我不必将安装JVM运行时的自定义文件夹添加到%PATH%环境变量中,而只需更改配置文件中的运行时目录。
That's the native Java program compiled
That's the directory of the configuration file in the program's files
That's the modified configuration file. I just had to change the value of app.runtime to the custom location of my shared JVM runtimes
The native Java program, now customised so that the runtime folder installs to my shared directory instead; this defined in the configuration file
My shared runtime folder
Inside the JVM binaries of the runtime directory
The native Java program, now without its own runtimes
有了这些自定义,我现在可以在没有Java的计算机上运行两个独立的Java原生程序,而不用让它们各自拥有自己的运行时,而是在共享运行时文件夹中共享运行时(在各自的配置文件中定义)。我还配置了本机程序的设置,这样,如果目标计算机上没有安装共享运行时,当通过其设置安装或修复任何一个程序时,它们就会安装在目标计算机上。此外,更新的、修改过的运行时可以很容易地设置为覆盖旧的运行时,从而更新共享文件夹中的运行时。

相关问题