使用Ant执行Java类报错:找不到trackdeployment.DeploymentTracker类求助
问题:Ant执行Java类时找不到已编译的类文件
目录结构
- 根目录:
ci - 构建文件路径:
ci/scripts/applications/deploy-bpm.daa.xml - Java类:
ci/trackdeployment/DeploymentTracker.class(代码包含package trackdeployment;声明) - 依赖包:
ci/lib/ojdbc8.jar
出错的Ant Target
<target name="update-deployment-details-in-db" description="Insert new or update existing entry in DB"> <property file="${basedir}/../../target/artifact/${bpm.app.name}.properties"/> <propertyfile file="${basedir}/../../target/artifact/${bpm.app.name}.properties" comment="properties file for @{bpm-app-name} application"> <entry key="Environment" value="${application.target.environment}"/> </propertyfile> <javac srcdir="${basedir}/../../trackdeployment" destdir="${basedir}/../../trackdeployment" classpath="${basedir}/../../lib/*.jar" debug="on" source="1.8" includeAntRuntime="false"/> <java classname="trackdeployment.DeploymentTracker"> <arg value="${bpm.app.name}"/> <classpath> <pathelement location="${basedir}/../../lib/ojdbc8.jar"/> <pathelement path="${java.class.path}"/> </classpath> </java> </target>
错误输出
C:\code\myappv>ant -f ci/scripts/applications/deploy-bpm-daa.xml -Dapplication.target.environment=DEV -Dbpm.environment.name=BPMEnvironment -Dbpm.app.name=notifications update-deployment-details-in-db Buildfile: C:\code\myappv\ci\scripts\applications\deploy-bpm-daa.xml update-deployment-details-in-db: [propertyfile] 更新属性文件:C:\code\myappv\ci\target\artifact\notifications.properties [javac] 编译1个源文件至C:\code\myappv\ci\trackdeployment [java] 找不到trackdeployment.DeploymentTracker,请确保已将其加入类路径 [java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:141) [java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:891) [java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:231) [java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:135) [java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:108) [java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:299) [java] at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source) [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [java] at java.lang.reflect.Method.invoke(Method.java:498) [java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99) [java] at org.apache.tools.ant.Task.perform(Task.java:350) [java] at org.apache.tools.ant.Target.execute(Target.java:449) [java] at org.apache.tools.ant.Target.performTasks(Target.java:470) [java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1401) [java] at org.apache.tools.ant.Project.executeTarget(Project.java:1374) [java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) [java] at org.apache.tools.ant.Project.executeTargets(Project.java:1264) [java] at org.apache.tools.ant.Main.runBuild(Main.java:818) [java] at org.apache.tools.ant.Main.startAnt(Main.java:223) [java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:284) [java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:101) [java] Java Result: -1 BUILD SUCCESSFUL Total time: 3 seconds C:\code\myappv>
当前类路径输出
[echo] 类路径为:C:\apps\apache\ant\lib\ant-launcher.jar;C:\apps\apache\ant\lib\ant-antlr.jar;C:\apps\apache\ant\lib\ant-apache-bcel.jar;C:\apps\apache\ant\lib\ant-apache-bsf.jar;C:\apps\apache\ant\lib\ant-apache-log4j.jar;C:\apps\apache\ant\lib\ant-apache-oro.jar;C:\apps\apache\ant\lib\ant-apache-regexp.jar;C:\apps\apache\ant\lib\ant-apache-resolver.jar;C:\apps\apache\ant\lib\ant-apache-xalan2.jar;C:\apps\apache\ant\lib\ant-commons-logging.jar;C:\apps\apache\ant\lib\ant-commons-net.jar;C:\apps\apache\ant\lib\ant-imageio.jar;C:\apps\apache\ant\lib\ant-jai.jar;C:\apps\apache\ant\lib\ant-javamail.jar;C:\apps\apache\ant\lib\ant-jdepend.jar;C:\apps\apache\ant\lib\ant-jmf.jar;C:\apps\apache\ant\lib\ant-jsch.jar;C:\apps\apache\ant\lib\ant-junit.jar;C:\apps\apache\ant\lib\ant-junit4.jar;C:\apps\apache\ant\lib\ant-junitlauncher.jar;C:\apps\apache\ant\lib\ant-launcher.jar;C:\apps\apache\ant\lib\ant-netrexx.jar;C:\apps\apache\ant\lib\ant-swing.jar;C:\apps\apache\ant\lib\ant-testutil.jar;C:\apps\apache\ant\lib\ant-xz.jar;C:\apps\apache\ant\lib\ant.jar;C:\Program Files\Java\jdk1.8.0_202\lib\tools.jar
解决方案
问题核心:Java任务的类路径未包含编译后class文件所在的包根目录。你的类属于trackdeployment包,JVM需要在类路径中找到包含trackdeployment文件夹的根目录(即ci目录)才能加载该类。
方案1:直接添加包根目录到类路径
修改<java>任务的classpath,加入ci目录的路径:
<java classname="trackdeployment.DeploymentTracker"> <arg value="${bpm.app.name}"/> <classpath> <pathelement location="${basedir}/../../lib/ojdbc8.jar"/> <pathelement location="${basedir}/../../"/> <!-- 加入ci目录,即包结构的根目录 --> <pathelement path="${java.class.path}"/> </classpath> </java>
方案2:规范分离源文件与编译文件(推荐)
将编译后的class文件输出到单独的目录,避免与源文件混放:
- 修改
<javac>任务的destdir为单独的classes目录:
<javac srcdir="${basedir}/../../trackdeployment" destdir="${basedir}/../../classes" classpath="${basedir}/../../lib/*.jar" debug="on" source="1.8" includeAntRuntime="false"/>
- 修改
<java>任务的classpath,加入这个classes目录:
<java classname="trackdeployment.DeploymentTracker"> <arg value="${bpm.app.name}"/> <classpath> <pathelement location="${basedir}/../../lib/ojdbc8.jar"/> <pathelement location="${basedir}/../../classes"/> <pathelement path="${java.class.path}"/> </classpath> </java>
内容的提问来源于stack exchange,提问作者Ranjeet
相关产品推荐
相关产品推荐

