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

Ant执行run目标时无法加载主类Main的问题排查

问题描述

我有一个内容非常简单的Main.java文件,代码如下:

public class Main {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}

该文件通过Ant编译,build.xml中的compile目标配置如下:

<target name="compile">
  <mkdir dir="${build.dir}" />
  <javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false"/>
</target>

编译后Main.class文件已生成在./build目录中。切换到./build目录执行命令%JAVA_HOME%\bin\java.exe Main可得到正确输出,但在项目根目录执行ant -v run时出现如下错误:

run:
     [java] Executing 'C:\Program Files\Microsoft\jdk-11.0.12.7-hotspot\bin\java.exe' with arguments:
     [java] 'Main'
     [java]
     [java] The ' characters around the executable and arguments are
     [java] not part of the command.
     [java] Error: Could not find or load main class Main
     [java] Caused by: java.lang.ClassNotFoundException: Main
     [java] Java Result: 1

build.xml中的run目标配置如下:

<target name="run" depends="compile">
  <java classname="Main" fork="true">
  </java>
</target>

请问问题出在哪里?

问题原因与解决方法

问题出在Ant的<java>任务未指定类路径(classpath)。

直接在./build目录执行java Main时,当前目录会被默认加入类路径,JVM能找到Main.class;但通过Ant在项目根目录执行时,JVM的工作目录是项目根目录,默认类路径不包含./build目录,因此无法定位到编译后的Main类。

修改run目标,添加类路径指定编译后的类文件目录即可:

<target name="run" depends="compile">
  <java classname="Main" fork="true">
    <classpath>
      <pathelement location="${build.dir}"/>
    </classpath>
  </java>
</target>

也可以使用更简洁的写法:

<target name="run" depends="compile">
  <java classname="Main" fork="true" classpath="${build.dir}"/>
</target>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:35:07