我有一个要求,我必须通过 Metrics Plugin 从不同的 Java 项目(在 Eclipse 中配置)中提取指标。 。我正在尝试使用 ANT 构建脚本自动化此过程。
我创建了一个 Java 实用程序项目,它将:
- 创建这些构建文件
- 将它们放入 Eclipse 中配置的相应 Java 项目中
- 尝试执行它们。
虽然 build.xml 正确运行,但当我尝试以编程方式运行它们时,出现以下错误:
Exception in thread "main" ProjectHelper.parse() must be implemented in a helper plugin org.apache.tools.ant.ProjectHelper
at org.apache.tools.ant.ProjectHelper.parse(ProjectHelper.java:277)
at com.metrics.generator.MetricsGenerator.runAntScripts(MetricsGenerator.java:69)
at com.metrics.generator.MetricsGenerator.doAutomate(MetricsGenerator.java:43)
at com.metrics.generator.MetricsGenerator.main(MetricsGenerator.java:30)
我假设 parse() 方法无法正常工作,但我不明白为什么。手动运行 build.xml 可以正常工作(这意味着 XML 文件已正确创建)。为了使 Eclipse 运行此构建,我必须进行的唯一修改是转到“运行”>“外部工具”>“外部工具配置”>“JRE”,然后选择“在与工作区相同的 JRE 中运行”
构建文件如下:
<project basedir="." default="init" name="projectName">
<target name="init">
<tstamp/>
</target>
<target depends="init" name="build">
<eclipse.refreshLocal depth="infinite" resource="projectName"/>
<metrics.enable projectName="projectName"/>
<eclipse.build BuildType="full" ProjectName="projectName" errorFormat="xml" errorOut="errors.xml" failOnError="true"/>
<metrics.export file="outputFile" projectName="projectName"/>
</target>
</project>
注意:[projectName] 和 [ouputFile] 当前在创建时提供,我只是在本文中省略了它们。仅供引用,我正在使用 Eclipse Indigo。 失败的代码如下所示:
private void runAntScripts(File[] projectFolders){
BuildLogger logger = new DefaultLogger();
logger.setOutputPrintStream(System.out);
logger.setErrorPrintStream(System.out);
logger.setMessageOutputLevel(Project.MSG_INFO);
Project metricsProject = new Project();
metricsProject.addBuildListener(logger);
ProjectHelper helper = new ProjectHelper();
metricsProject.addReference("ant.projectHelper", helper);
File buildFile;
int totalFolders = projectFolders.length;
for(int index = 0; index < totalFolders; index++){
buildFile = new File(projectFolders[index], buildXMLFileName);
if(buildFile.isFile()){
helper.parse(metricsProject, buildFile);
metricsProject.setProperty("ant.file", buildFile.getAbsolutePath());
metricsProject.init();
metricsProject.setBaseDir(projectFolders[index]);
metricsProject.executeTarget("build");
}
}
}
最佳答案
问题之一可能是您获得 ProjectHelper
的方式。实例。尝试:
ProjectHelper helper = ProjectHelper.getProjectHelper();
您调用 Project.init()
似乎也没有意义。 添加引用并设置属性之后。为每个构建文件创建一个新项目并调用 init
可能会更干净。 在调用 addReference
之前和setProperty
.
关于java - 通过 Java 以编程方式运行 ANT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10035188/