通过Java以编程方式运行ANT

时间:2012-04-05 20:02:31

标签: java ant metrics

我需要通过Metrics Plugin从不同的Java项目(在Eclipse中配置)中提取指标。我正在尝试使用ANT构建脚本自动执行此过程。

我已经创建了一个Java实用程序项目:

  1. 创建这些构建文件
  2. 将它们放入Eclipse中配置的各个Java项目
  3. 尝试执行它们。
  4. 当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运行此构建的唯一修改是转到Run>外部工具>外部工具配置> 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");
            }
        }
    }
    

1 个答案:

答案 0 :(得分:4)

其中一个问题可能是您获得ProjectHelper实例的方式。尝试:

ProjectHelper helper = ProjectHelper.getProjectHelper();

在添加引用并设置属性后,您正在调用Project.init() 似乎没有意义。为每个构建文件创建一个新项目可能更简洁,并在调用initaddReference之前调用setProperty