减少本机部署的JavaFX应用程序的大小

减少本机部署的JavaFX应用程序的大小,javafx,javafx-8,Javafx,Javafx 8,我正在用JavaFX编写一个应用程序,我担心我将在本地部署的.EXE文件的大小。我拥有的应用程序并没有那么大(总共不到500万个),但Java运行时将最终安装的目录压缩到100万个以上,压缩成一个可编辑的44M文件 我一直在用64位Windows(JavaSE8U77)运行测试。为了使最终可执行文件更小,我删除了JRE中不必要的部分,如下所述: 以下是我的发现: 完整JRE:45.0米 剥离JRE:44.0米 有人对如何使可分发的.EXE更小有什么想法吗?我发现的所有信息都至少有2到3年的历

我正在用JavaFX编写一个应用程序,我担心我将在本地部署的.EXE文件的大小。我拥有的应用程序并没有那么大(总共不到500万个),但Java运行时将最终安装的目录压缩到100万个以上,压缩成一个可编辑的44M文件

我一直在用64位Windows(JavaSE8U77)运行测试。为了使最终可执行文件更小,我删除了JRE中不必要的部分,如下所述:

以下是我的发现:

  • 完整JRE:45.0米
  • 剥离JRE:44.0米
有人对如何使可分发的.EXE更小有什么想法吗?我发现的所有信息都至少有2到3年的历史,可能不再那么相关了。我觉得JRE可以带来更多的好处,但这似乎违反了许可


是否有人有使用任何非Oracle发行版或任何其他方法使JavaFX应用程序更小的经验?

实现这一点的最佳工具之一是。


在生成可执行文件之前先运行程序

使用javapackager时,可以设置为不包含JRE。这使得本机启动器使用本地安装的JRE(这可能不是最好的解决方案)

使用javafx maven插件时,只需设置bundlerArgument:

<configuration>
    <mainClass>com.zenjava.test.Main</mainClass>
    <bundleArguments>
        <runtime /> <!-- dont include JRE, use installed one -->
    </bundleArguments>
</configuration>
使用javapacker本身的ant样式xml文件时,只需设置以下内容:


免责声明:我是的维护者和的创建者。

你有什么建议?简单地针对我的应用程序运行Proguard是毫无意义的,因为它与Java运行时相比太小了。有没有人有过压缩Java运行时的经验?就许可而言,这是否合法?目前剥离JRE违反了许可协议。不过,有了Java9(jigsaw项目),这将是可能的。今天有什么办法可以解决这个问题吗?@EugeneRyzhikov甲骨文自己提供的工具将JRE剥离。他们在打包所有东西的同时生成了一些精简的JRE。我同意,Proguard只会将自己的代码精简到最低限度,这不是这里的问题。正如[@Sander-Smith]所言,似乎有一些有效的方法可以删除JRE的某些部分。也许像这样的工具有用?真的很难找到什么。尽管如此,已经有了Java9的版本。您可以使用它来打包应用程序。java8jdk包含一个名为jdeps的工具,也许我注意到了这个选项,但我还不明白它如何不会产生比它解决的问题多得多的问题。如果有人试图在没有适当JVM的情况下安装,会发生什么情况?我猜它不会很漂亮。事先解释要做什么(例如安装这个版本的Java)是一个文档噩梦。还有。。。。根据我的经验,简单地对普通人说“Java”会让他们感到震惊,因为“这是一个如此安全的问题”。@SanderSmith是的,这是非常正确的。其中一些被用作(付费)解决方案。也许你想试试。所有这些都有一个共同点,就是现在将JRE包含在您的包中。可以将现有的javapackager与launch4j捆绑包结合起来(在maven的情况下,有两个配置文件:一个launch4j,两个具有特殊配置的javafx maven插件)。@SanderSmith有一个问题你必须自己解决:你是否依赖用户安装的JRE,或者,您希望通过在捆绑包中提供您自己的JRE(但存在错误修复的安全风险)来从java恐惧用户手中夺走这项任务吗。我个人倾向于第二种选择,因为您不必处理“不同的JRE行为”,这样可以更好地重现行为。用于更新:;)一些用户对软件有更好的感觉,他们经常得到更新,而有些则没有。
jfx {
    verbose = true
    mainClass = 'your.application.appname'
    appName = 'appname'
    jfxMainAppJarName = 'appname.jar'
    vendor = "My Company"
    bundleArguments = [
        runtime: null
    ]
}