Java 的一次编译到处运行在目前还有优势吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SGL
V2EX    Java

Java 的一次编译到处运行在目前还有优势吗

  •  
  •   SGL 4 小时 43 分钟前 1720 次点击
    各种二进制打在镜像里面也算是一次编译到处运行吧。
    25 条回复    2025-10-24 20:35:57 +08:00
    renfei
        1
    renfei  
       4 小时 40 分钟前
    有啊,国产化替代的时候,我们 javaer 不用考虑各种国产化 CPU 的差异,都扔给 JVM 了
    SGL
        2
    SGL  
    OP
       4 小时 36 分钟前
    @renfei 那 JVM 的适配是国产化 CPU 厂商自己提供的吗。
    zhoudaiyu
        3
    zhoudaiyu  
    PRO
       4 小时 33 分钟前
    @SGL #2 用 openjdk 的就可以,无非就是 ARM 和 X86
    hronro
        4
    hronro  
       4 小时 21 分钟前
    没有任何优势,因为在需要运行的机器上还需要安装 JVM ,所以很多面向普通用户的软件在分发的时候,会选择把用到 JRE 打包一起分发,这种分发方式比起用 Go 写的纯静态编译的软件,没有任何优势,相比之下 Go 写的软件冷启动速度更快,体积更小,全方面地胜过 JVM 。

    假如时间倒流,当初 JAVA 选择和各大操作系统厂商合作,直接在 OS 里内置 JRE ,用户直接下载 JAR 包就能运行,那这种方式可能还有点意义,不过这种 JAVA 程序员在写代码的时候就得写各种兼容性代码来确保在各 JVM 版本里的兼容性了。
    hronro
        5
    hronro  
       4 小时 20 分钟前
    @renfei 放到编译型语言里,这也是编译器后端需要考虑的事情,普通的业务层代码也不关心这个。
    bootvue
        6
    bootvue  
       4 小时 17 分钟前
    只有生态的优势 各种轮子 除此之外没有任何优势
    yakun4566
        7
    yakun4566  
       4 小时 16 分钟前
    @hronro #4 很多年的 Javaer ,没有用过 go ,之前遗留的项目有个 Go 的项目,同事在部署的时候本地打完包在服务器上运行不了,最后发现是 win10 跟 Windows server 的依赖不一样,还把 go 的版本降级了才打包能在服务器运行。相对于在服务器上装个符合版本的 jvm ,我觉得还是 java 比较省心
    bronyakaka
        8
    bronyakaka  
       4 小时 12 分钟前
    单论体积 非云场景优势很大,比 go 那几十 mb 一坨更轻量;但我感觉这点体积也不重要,aot 快速启动比较舒服
    gam2046
        9
    gam2046  
       3 小时 59 分钟前
    以现阶段看,其实是伪命题了,能到处运行又怎么样,你的依赖项还是得根据不同平台来装,除了现在少数开源软件的 GUI 采用的 Java 编写,算是用上了这个“一次编译,到处运行”的特点,其他场景下,这个的意义都不大了,如果真的想对于环境差异,进行抹平,还不如 docker 一把梭
    joshuacavell
        10
    joshuacavell  
       3 小时 57 分钟前
    Cpp 和 JAVA 都争论这个话题几十年了,各自都有完整的论述.只要生态够完整就没有必要纠结.而且都到这个体量了,编译型的新语言层出不穷,基于虚机技术的几乎只有 C#和 JAVA.
    C#用户怼 JAVA 正常,Cpp 作为编译型语言的旗帜和 JAVA 辩经也正常,其他语言碰瓷 JAVA 是真好笑
    hronro
        11
    hronro  
       3 小时 48 分钟前
    @yakun4566 你说的依赖是外部软件依赖么,这种换 JAVA 来不也还是一样?
    zxjxzj9
        12
    zxjxzj9  
       3 小时 47 分钟前
    现在来看最能解决一次编译到处运行的反而是 docker ,其次是 go 这种到处编译到处运行的,最后才是 java 这种一次编译但是要考虚拟机到处运行的。
    dzdh
        13
    dzdh  
       3 小时 45 分钟前
    @yakun4566 #7

    1.2x 版本前后对 win 的支持不一样好像删除了一个什么 api 。win32 啥的。https://github.com/golang/go/issues/57003
    unused
        14
    unused  
       3 小时 43 分钟前
    @zxjxzj9 docker 只能处理依赖,解决不了架构问题
    huijiewei
        15
    huijiewei  
       3 小时 37 分钟前
    优势当然是有的。一个写业务的,直需要考虑在 jvm 里面没 bug 就行了,平台和架构的复杂性 jvm 都帮你解决了。

    你自己试试 go 。编译完,目系统稍微升级个小版本就可能 boom
    han1988
        16
    han1988  
       3 小时 36 分钟前
    @renfei 国产 JVM 的 bug 怎么修?
    fortytwo
        17
    fortytwo  
       3 小时 36 分钟前
    我觉得这个问题在当时的时代背景比较重要,现在完全不重要了。
    Java 核心在于 JVM 虚拟机设计,来完成“一次编译到处运行”功能。
    现在各种服务大多也是运行在系统层级定制的虚拟机上的。
    任何语言,本质上都可以使用 dockers 等虚拟化工具来运行。


    但是 JVM 这个先发优势,给了 Java 足够的时间发展生态。使得生态成为了 Java 护城河,和 Python 一样。

    所以没有优势,唯一的优势是 Java 生态,大类的工具类库,解决方案。
    Ayanokouji
        18
    Ayanokouji  
       3 小时 35 分钟前
    1. 一次编译到处运行在目前没有啥优势,java 自己都在搞 native
    2. 不能否认 jvm 的其他优势
    dddd1919
        19
    dddd1919  
       3 小时 34 分钟前
    jvm 优势还是有的,程序自身的适配能力强。
    但系统越来越复杂化,除了应用本身,外部依赖越来越多,比如图片处理会用到 imagemagick ,视频加工用到 ffmpeg ,一个完整应用的边界从一个简单进程延伸到各种第三方依赖,所以 java 的理念在今天也就拓展到虚拟化技术上,把整套系统打包成一个可以到处运行的包,比如大型的 vm ,或者轻量的 docker
    raptor
        20
    raptor  
       3 小时 30 分钟前
    JAVA 的优势早就不在这里了,而在于生态和会的人多
    dacapoday
        21
    dacapoday  
       3 小时 18 分钟前
    WASM+(C/C++,Rust,Python)
    james2013
        22
    james2013  
       2 小时 53 分钟前 via Android
    当然有优势,做为后端项目,生态成熟,强类型,到处运行。除了内存占用的较多
    我用了几年 python ,python 大项目光是在本机 win10 和服务器 unbutu 进行运行的差距就太大了。
    moverinfo
        23
    moverinfo  
       2 小时 28 分钟前 via iPhone
    如果单从一次编译到处运行,我认为没有优势。因为实际情况是你的软件并没有一会儿在 Windows 上运行,一会儿在 Linux 上运行的需要。而 Java 的优势是它的健壮性,稳定性,调试也相对容易。它的生态还是比较庞大的。你用另一个语言真的无法替代它。

    我最近聚焦在 Java 的框架设计上,期待开发一套轻量级、同时支持命令行和 Web 服务的方式运行的框架。这样的开发出来的软件维护起来就会比较方便。
    000sitereg
        24
    000sitereg  
       49 分钟前
    @moverinfo 是的 但是会运行在不同的 linux 发行版上。但是只要转好了 jvm 就都不管了。
    我可以本地编译放到服务器,也可以从服务器下载我的程序在本地跑。
    CPP 做不到。已经实现当初的目标了。后来者 go 啥的 上面已经说了
    rb6221
        25
    rb6221  
       42 分钟前
    有的兄弟有的
    草台班子公司里,我在我的 windows 开发机上改了 java 代码,然后打个 jar 出来,把这个 jar 直接丢到 linux 服务器上就行了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2549 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 13:17 PVG 21:17 LAX 06:17 JFK 09:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86