请教关于 Java 打包 exe 的问题

2020-06-10 10:29:30 +08:00
 lasuar

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

原贴

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


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

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

3805 次点击
所在节点    Java
13 条回复
autoname
2020-06-10 11:00:50 +08:00
cheng6563
2020-06-10 11:07:18 +08:00
Java 可以静态编译
senninha
2020-06-10 15:05:48 +08:00
非码农朋友让你帮忙写个小工具,丢个 jar 方便,还是直接丢一个 exe 方便呢?
hantsy
2020-06-10 15:10:45 +08:00
可以编译成机器内码。

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

Quarkus 最初可能都是关注在 Web 开发,现在 Command Mode 支持后,可以直接借助它编译成 Graavl 内码。
monkeyWie
2020-06-10 15:12:58 +08:00
一般来说 java 打成 exe 不是真正意义上的二进制文件执行,而是一个 exe 壳,里面还是有 jre,用 jre 来运行的 java,所以体积会非常大。
现在 oracle 有一个叫 GraalVM 的东西,支持 AOT 编译,这才是真正的静态编译,可以试试看: https://www.graalvm.org/getting-started/#native-images
lasuar
2020-06-10 17:02:37 +08:00
@hantsy
@monkeyWie
感谢回复!
lasuar
2020-06-10 17:03:16 +08:00
@senninha 这算是一个很小的优势吧 :)
lqw3030
2020-06-10 20:47:28 +08:00
我都把 jdk 打给朋友,百来兆,让 java 在朋友电脑上发光发热😂
penguinWWY
2020-06-11 01:43:40 +08:00
SubstrateVM
一般 java 的 AOT 都是为了降低启动时间,而且打出来的 binary 会非常大
fancy2020
2020-06-11 07:27:03 +08:00
会损失了跨平台的特性吧
lasuar
2020-06-11 08:48:10 +08:00
@fanchangyong 运行环境( jre 、jdk )也会打包进去,所以跨平台没有问题,主要的问题是即使代码打包 exe 也是包含了解释器的,整个运行速率没有提高,就如同标题所说,想来 Python 也是一样的原理,我的问题已经有答案了。
albertofwb
2020-06-11 08:57:29 +08:00
java python 这两种语言从设计上就是通过虚拟机(解释器)运行的 所谓的编译,就是将代码翻译为解释器可以识别的格式(字节码)
因此,所有的针对这两种语言的打包,也都是围绕着解释器展开的
qwerthhusn
2020-06-11 09:28:02 +08:00
不知道现在比较火的 GraalVM 能不能达到效

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX