JDK 18中System.exit()在ANT构建中的行为变更咨询
问题原因分析
这是JDK 18引入的**JEP 411(弃用Security Manager并准备移除)**及关联的JDK-8272669变更导致的行为差异,具体细节如下:
Ant
<java>任务的默认执行逻辑
你的Ant配置里,<java>任务未设置fork="true",默认会在Ant自身的JVM进程中执行Main类,而非启动独立子进程。JDK 17及更早版本的处理方式
在JDK 17及以前,Ant会通过自定义SecurityManager拦截System.exit()调用。当Main类执行System.exit(0)时,这个拦截机制会阻止JVM直接退出,让Ant能继续执行后续的<echo>任务。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
相关产品推荐
相关产品推荐

