You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK 18中System.exit()在ANT构建中的行为变更咨询

问题原因分析

这是JDK 18引入的**JEP 411(弃用Security Manager并准备移除)**及关联的JDK-8272669变更导致的行为差异,具体细节如下:

  1. Ant <java>任务的默认执行逻辑
    你的Ant配置里,<java>任务未设置fork="true",默认会在Ant自身的JVM进程中执行Main类,而非启动独立子进程。

  2. JDK 17及更早版本的处理方式
    在JDK 17及以前,Ant会通过自定义SecurityManager拦截System.exit()调用。当Main类执行System.exit(0)时,这个拦截机制会阻止JVM直接退出,让Ant能继续执行后续的<echo>任务。

  3. JDK 18的变更影响
    JDK 18中正式弃用并移除了SecurityManager的核心支持,Ant依赖的SecurityManager拦截System.exit()的机制彻底失效。此时Main类调用System.exit(0)会直接终止整个Ant的JVM进程,后续<echo>任务自然无法执行。

解决方案

若要在JDK 18及后续版本中保留JDK 17的行为,可修改Ant的<java>任务配置,添加fork="true"属性,让Main类在独立子JVM进程中执行:

<target name="myTask" depends="compile">
    <java classname="Main" fork="true">
        <classpath>
            <pathelement location="${classes.dir}"/>
        </classpath>
    </java>
    <echo message="myTask completed"/>
</target>

设置后,Main类调用System.exit(0)只会终止子JVM进程,Ant主JVM不受影响,后续<echo>任务可正常执行。

内容的提问来源于stack exchange,提问作者Shashank Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:26:04