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
相关产品推荐
相关产品推荐

