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

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

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

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

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

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


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

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

    我最近聚焦在 Java 的框架设计上,期待开发一套轻量级、同时支持命令行和 Web 服务的方式运行的框架。这样的开发出来的软件维护起来就会比较方便。
    000sitereg
        24
    000sitereg  
       1 天前
    @moverinfo 是的 但是会运行在不同的 linux 发行版上。但是只要转好了 jvm 就都不管了。
    我可以本地编译放到服务器,也可以从服务器下载我的程序在本地跑。
    CPP 做不到。已经实现当初的目标了。后来者 go 啥的 上面已经说了
    rb6221
        25
    rb6221  
       1 天前
    有的兄弟有的
    草台班子公司里,我在我的 windows 开发机上改了 java 代码,然后打个 jar 出来,把这个 jar 直接丢到 linux 服务器上就行了
    lysShub
        26
    lysShub  
       1 天前
    一直认为这种说法很取巧,还不是先得安装对应系统架构的 JVM

    要求有 gcc 环境,那 C 不也能 run anywhere?
    Gilfoyle26
        27
    Gilfoyle26  
       1 天前   ❤️ 1
    有优势,好招人 ,单论语言来说,Java 的牛马是最多的。
    nkidgm
        28
    nkidgm  
       1 天前
    很多人都没意识到,Java 最有价值的东西是 JVM.
    guanzhangzhang
        29
    guanzhangzhang  
       1 天前   ❤️ 1
    @huijiewei 言论过于逆天
    zwzwzwzwzxt
        30
    zwzwzwzwzxt  
       22 小时 7 分钟前
    @lysShub #26 cosmopolitan 项目了解一下。真·一次编译到处运行 /doge
    aleviosa
        31
    aleviosa  
       20 小时 23 分钟前
    JS 和 Python 甚至不需要(开发者自己)编译也能到处运行,开发效率还更高,相比之下 Java 的优势是生态成熟和码农池子大,当然这也是场景和区域限定。国外那种 native app 还不如网站功能齐全,缺乏巨无霸 app ,到处都是 web 服务的地方,JS 的应用生态和码农池子更大。现在最热的 AI ,赛博炼丹的又都是 Python 。现在各大 LLM 写代码训练得成熟的不是 JS 就是 Python ,日后马太效应还会更来更严重……
    msg7086
        32
    msg7086  
       18 小时 11 分钟前   ❤️ 1
    @lysShub 你是说同一个 C 二进制文件可以到处运行?
    Linux 下编译出来的 C executable 可以在 Windows 上直接运行?
    greenskinmonster
        33
    greenskinmonster  
       18 小时 3 分钟前 via Android
    我前一阵把客户一个 Java 1.5 版本 32 位的 jre 升级成了 1.8 版本 64 位,解决最大内存不足的问题,代码不需要任何调整,你说有没有用,反正是省了我很多事。
    shiloh595
        34
    shiloh595  
       17 小时 19 分钟前
    @Gilfoyle26 别骂了
    iseki
        35
    iseki  
       15 小时 52 分钟前 via Android
    有优势也有劣势。当你看到一个 jar 包老大个因为里面放了十几个平台的动态库而你的程序只需要在两个平台上运行时你就不太高兴了。不过题外话 OpenJDK 兼容性确实做得比 Go Runtime 强,OpenJDK24 还能在 Windows 7 上运行,但是 Go 却不行了。
    yb2313
        36
    yb2313  
       15 小时 48 分钟前   ❤️ 1
    wasm: 你好
    hefish
        37
    hefish  
       15 小时 18 分钟前
    当然没有优势,不然我们写 go, 写 c ,写 rust 的还怎么装逼。
    sir283
        38
    sir283  
       14 小时 37 分钟前
    Java 肯定没有优势了,优势都被 Web 前端、Golang 、Rust 给超越了,特别是前端的 JavaScript ,一份代码走天下,都不需要虚拟机了。
    kxg3030
        39
    kxg3030  
       13 小时 24 分钟前
    是一份代码,处处编译,不是一次编译,处处运行
    DrakenZeng
        40
    DrakenZeng  
       13 小时 21 分钟前
    已经转换到 Rust
    YzSama
        41
    YzSama  
       13 小时 11 分钟前
    @hronro #4 JVM 的规范和生态,已经不仅仅是 Java 独享了。

    如果需要迁移适配, 国产 CPU 可以快速的按 JVM 规范进行适配的。 这个还是有很好的优势。 对 Java 程序来说,本身就没变化。
    YzSama
        42
    YzSama  
       13 小时 9 分钟前
    @guanzhangzhang #29 抓住馆长
    yolee599
        43
    yolee599  
       12 小时 41 分钟前 via Android
    java 的优势在于招人容易,人力便宜,虽然啰嗦但是容易维护,代码风格比较统一,可以用的库多
    VeteranCat
        44
    VeteranCat  
       11 小时 19 分钟前
    Java,只要有 Spring 就足够了。 任你怎么辩经,等其他语言有了类似的几乎已经成为标准的框架再来说吧。
    VeteranCat
        45
    VeteranCat  
       11 小时 17 分钟前
    @nkidgm 他们都是拿个人开发的小账来算企业级开发的大账,挺无语的,都懒得跟他们辩。
    unixipc
        46
    unixipc  
       11 小时 14 分钟前
    巨大的优势,码农在自己机器上做开发( Windows ,MacOS ),然后部署到任意环境,语言和框架的行为不会有任何不同。
    xufei0913
        47
    xufei0913  
       11 小时 8 分钟前   ❤️ 1
    放到现在 java 唯一的优势就是生态,而生态放到任何一个行业都是王炸
    nuII
        48
    nuII  
       10 小时 47 分钟前
    在选软件的时候,用 java 写的是扣分项
    ingramyang
        49
    ingramyang  
       10 小时 19 分钟前
    我的观点 47 楼一致。Java 的到处运行优势在云原生( docker ,K8S )生态下已荡然无存,并且启动效率和内存占用还有依赖都极其笨重。但生态,是其他语言短时间内无法逾越的问题,这导致 Java 如今依然流行。
    michaelFu
        50
    michaelFu  
       10 小时 15 分钟前
    到处运行的优势在新语言前面没有优势,但是庞大的生态、从业人员以及比较统一的业内实践是最大的优势
    LieEar
        51
    LieEar  
       9 小时 49 分钟前
    我觉得没有了,现在都是 docker ,谁还管环境。
    nebkad
        52
    nebkad  
       9 小时 16 分钟前
    先说一个,我不太相信 JVM 能提供手游客户端的运行环境。
    如果有,请出来打我脸。
    否则,Java 早就不是一次编译到处运行,只是一句过时的宣传语而已。
    abellee000
        53
    abellee000  
       7 小时 8 分钟前
    @yakun4566 这是 windows 的问题,不是 go 和 java 的问题
    shijingshijing
        54
    shijingshijing  
       4 小时 11 分钟前
    @hronro 假如时间倒流,当初 JAVA 选择和各大操作系统厂商合作,直接在 OS 里内置 JRE ,用户直接下载 JAR 包就能运行,那这种方式可能还有点意义
    ----------------------------------
    你说的是不是.Net 🤣
    longlonglanguage
        55
    longlonglanguage  
       4 小时 9 分钟前
    我一直有个疑惑,凭啥他能夸下海口说一次编译到处运行?程序里用了 win 的 api ,编译器可以自动转义成 linux 的?他所说的到处运行,应该是跨平台的意思吧。既,我这个编程语言可以在不同的平台上运行,而不是编写的脚本可以在任意平台运行,如果真的可以,那如今就不会 Electron 浏览器套壳盛行了,而是套 java 壳了。
    dyingfire
        56
    dyingfire  
       3 小时 47 分钟前
    生态才是他的优势,不过现在越来越被蚕食了
    bbbblue
        57
    bbbblue  
       3 小时 37 分钟前
    @longlonglanguage
    你用 Electron 套壳去调 win api 放 linux 上一样不行啊 😂
    bbbblue
        58
    bbbblue  
       3 小时 35 分钟前
    @shijingshijing
    .NET 还得安装特定版本 😂 然后电脑里就一堆.NET 各个版本的 Runtime
    WngShhng
        59
    WngShhng  
       3 小时 30 分钟前
    我现在在用 compose 写 jvm desktop ,也算是 Java 的一次编译到处运行,问题是包体积太大,且代码没安全性可言
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1341 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:47 · PVG 00:47 · LAX 09:47 · JFK 12:47
    ♥ Do have faith in what you're doing.