V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lasuar
V2EX  ›  Java

请教关于 Java 打包 exe 的问题

  •  
  •   lasuar · 2020-06-10 10:29:30 +08:00 · 3793 次点击
    这是一个创建于 1608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    :迫于之前发的节点曝光量太少,重新发一贴。

    原贴

    我了解到的 Java 是可以像 Python 提前打包成 exe 文件的,从而做到运行时不需要解释器,而且二进制文件执行速度我想也是要快于解释执行的,那么为什么这不是一种常见操作呢,而是在运行时使用 Jvm,Python 也是通过 Python 解释器启动? 这其中的根本原因是什么呢?


    :我从网上一些资料上查到简明的解释是: 直接打包 Java 或 Python 代码到 exe 文件,其实没能改变什么,得到的 exe 文件大小会非常大(相对于编写的源代码),因为它把语言的解释器部分也给打包进去了,最终运行过程和通过解释器运行没有两样(速度没有多大提升),这样还打包 exe 就没什么益处了。

    也请各位回复前也稍作思考一下,谢谢~

    13 条回复    2020-06-11 09:28:02 +08:00
    autoname
        1
    autoname  
       2020-06-10 11:00:50 +08:00
    cheng6563
        2
    cheng6563  
       2020-06-10 11:07:18 +08:00 via Android
    Java 可以静态编译
    senninha
        3
    senninha  
       2020-06-10 15:05:48 +08:00
    非码农朋友让你帮忙写个小工具,丢个 jar 方便,还是直接丢一个 exe 方便呢?
    hantsy
        4
    hantsy  
       2020-06-10 15:10:45 +08:00
    可以编译成机器内码。

    比如,https://quarkus.io/blog/native-command-mode-tools/

    Quarkus 最初可能都是关注在 Web 开发,现在 Command Mode 支持后,可以直接借助它编译成 Graavl 内码。
    monkeyWie
        5
    monkeyWie  
       2020-06-10 15:12:58 +08:00   ❤️ 1
    一般来说 java 打成 exe 不是真正意义上的二进制文件执行,而是一个 exe 壳,里面还是有 jre,用 jre 来运行的 java,所以体积会非常大。
    现在 oracle 有一个叫 GraalVM 的东西,支持 AOT 编译,这才是真正的静态编译,可以试试看: https://www.graalvm.org/getting-started/#native-images
    lasuar
        6
    lasuar  
    OP
       2020-06-10 17:02:37 +08:00
    @hantsy
    @monkeyWie
    感谢回复!
    lasuar
        7
    lasuar  
    OP
       2020-06-10 17:03:16 +08:00
    @senninha 这算是一个很小的优势吧 :)
    lqw3030
        8
    lqw3030  
       2020-06-10 20:47:28 +08:00 via iPhone
    我都把 jdk 打给朋友,百来兆,让 java 在朋友电脑上发光发热😂
    penguinWWY
        9
    penguinWWY  
       2020-06-11 01:43:40 +08:00
    SubstrateVM
    一般 java 的 AOT 都是为了降低启动时间,而且打出来的 binary 会非常大
    fancy2020
        10
    fancy2020  
       2020-06-11 07:27:03 +08:00 via iPhone
    会损失了跨平台的特性吧
    lasuar
        11
    lasuar  
    OP
       2020-06-11 08:48:10 +08:00
    @fanchangyong 运行环境( jre 、jdk )也会打包进去,所以跨平台没有问题,主要的问题是即使代码打包 exe 也是包含了解释器的,整个运行速率没有提高,就如同标题所说,想来 Python 也是一样的原理,我的问题已经有答案了。
    albertofwb
        12
    albertofwb  
       2020-06-11 08:57:29 +08:00
    java python 这两种语言从设计上就是通过虚拟机(解释器)运行的 所谓的编译,就是将代码翻译为解释器可以识别的格式(字节码)
    因此,所有的针对这两种语言的打包,也都是围绕着解释器展开的
    qwerthhusn
        13
    qwerthhusn  
       2020-06-11 09:28:02 +08:00
    不知道现在比较火的 GraalVM 能不能达到效
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   979 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 20:53 · PVG 04:53 · LAX 12:53 · JFK 15:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.