Eclipse无法以编程方式编译ant脚本

时间:2011-06-20 04:22:58

标签: eclipse ant javac

我有一个Ant脚本,我想使用我制作的按钮来执行。现在的问题是我会收到错误说:

  

建立失败

     

X:\ eclipseMT \运行时的工作空间\ TESTTEST \ diagram1_Sc2_TestScript.xml:68:   无法找到javac编译器;   com.sun.tools.javac.Main不在   类路径。也许JAVA_HOME没有   指向JDK。它目前已设定   到“C:\ Program   文件\爪哇\ jdk1.6.0_12 \ JRE“

我很确定我的类路径是正确的,我可以使用Eclipse内部Ant执行器执行相同的脚本。

这是我的蚂蚁脚本:          

<property name="src.dir" value="src" />
<property name="test.dir" value="test" />
<property name="test.wstest.dir" value="${test.dir}/wstest" />
<property name="junit.dir" location="X:\eclipseMT\plugins\org.junit_3.8.2.v3_8_2_v20100427-1100"/>
<property name="build.dir" value="build" />
<property name="build.classes.dir" value="${build.dir}/classes" />
<property name="build.test.dir" value="${build.dir}/test"/>
<property name="build.test.classes.dir" value="${build.test.dir}/classes" />
<property name="build.test.data.dir" value="${build.test.dir}/data" />
<property name="build.test.reports.dir" value="${build.test.dir}/reports" />
<property name="dist.dir" value="dist" />
<property name="lib.dir" value="lib" />
<property name="build.debug" value="true" />

<path id="compile.classpath">
    <fileset dir="lib">
        <include name="*.jar"/>
    </fileset>
</path>

<path id="test.compile.classpath">
    <path refid="compile.classpath" />
    <pathelement location="${build.classes.dir}"/>
</path>

<path id="test.classpath">
    <path refid="test.compile.classpath" />
    <pathelement location="${build.test.classes.dir}"/>
</path>

<target name="init" description="create dir desc">
    <mkdir dir="${build.dir}" />
    <mkdir dir="${build.classes.dir}" />
    <mkdir dir="${dist.dir}" />
    <mkdir dir="${lib.dir}" />
    <copy todir="${lib.dir}">
        <fileset dir="${junit.dir}"/>
    </copy>
    <echo>make init dir done</echo>
</target>

<target name="test-init" depends="init" description="create test dir">
    <mkdir dir="${build.test.dir}" />
    <mkdir dir="${build.test.classes.dir}" />
    <mkdir dir="${build.test.data.dir}"/>
    <mkdir dir="${build.test.reports.dir}"/>
<echo>make test init dir done</echo>
</target>

<target name="clean" depends="init, test-init" description="remove previous build">
    <delete verbose="true">
        <fileset dir="${build.classes.dir}" />
        <fileset dir="${build.test.classes.dir}" />
        <fileset dir="${build.test.data.dir}" />
        <fileset dir="${build.test.reports.dir}" />
        <fileset dir="${dist.dir}" />
    </delete>
    <echo>clean build dir done</echo>
</target>

<target name="compile" depends="clean" description="compile java source">
    <javac srcdir="${src.dir}" destdir="${build.classes.dir}" classpath="${build.classes.dir}" debug="on" fork="no" includeAntRuntime="false" />
    <echo>compile source done</echo>
</target>

<target name="test-compile" depends="compile, test-init" description="compile test source">
    <javac srcdir="${test.wstest.dir}" destdir="${build.test.classes.dir}" debug="true" includeAntRuntime="true">
        <classpath refid="test.compile.classpath" />
    </javac>
    <echo>compile test src done</echo>
</target>

<target name="test-reporting" depends="test-compile" description="report even if fail">
    <junit printsummary="false" errorproperty="test.failed" failureproperty="test.failed">
        <classpath>
            <path refid="test.classpath" />
        </classpath>
        <formatter type="brief" usefile="false" /> 
        <formatter type="xml" />
        <batchtest todir="${build.test.data.dir}" unless="testcase">
            <fileset dir="${build.test.classes.dir}" />
            <!--fileset dir="${build.test.classes.dir}" includes="Sc2TestClient*.class" /-->
        </batchtest>
    </junit>

    <junitreport todir="${build.test.data.dir}">
        <fileset dir="${build.test.data.dir}">
            <include name="WSTEST-*.xml" />
        </fileset>
        <report format="frames" todir="${build.test.reports.dir}" />
    </junitreport>
    <fail if="test.failed">
        Test failed. Check ${build.test.reports.dir}
    </fail>
</target>

<target name="default" depends="test-reporting" description="test the whole suite">
    <echo>all test done</echo>
    <tstamp>
        <format property="buildTime" pattern="yyyy-MM-dd' 'HH:mm:ss" />
    </tstamp>
    <echo>build time = ${buildTime}</echo>
</target>

这是我的按钮代码:

Project p = new Project();

    try {
        p.setUserProperty("ant.file", buildFile.getAbsolutePath());     

        DefaultLogger consoleLogger = new DefaultLogger();
        consoleLogger.setErrorPrintStream(System.err);
        consoleLogger.setOutputPrintStream(System.out);
        consoleLogger.setMessageOutputLevel(Project.MSG_INFO);

        p.addBuildListener(consoleLogger);          
        p.fireBuildStarted();
        p.init();

        ProjectHelper helper = ProjectHelper.getProjectHelper();
        p.addReference("ant.projectHelper", helper);
        helper.parse(p, buildFile);
        p.executeTarget(p.getDefaultTarget());
        p.fireBuildFinished(null);
    } catch (Throwable t) {
        t.printStackTrace();
        p.fireBuildFinished(t);
        return false;
    }

2 个答案:

答案 0 :(得分:1)

它抱怨javac,无法找到javac ..你的JAVA_HOME(C:\ Program Files \ Java \ jdk1.6.0_12 \ jre)只指向“jre”而不指向java编译器(javac)。将JAVA_HOME设置为“C:\ Program Files \ Java \ jdk1.6.0_12 \ bin”(其中包含javac和jre),它应该可以正常工作。 : - )

- Nagesh Palathya

答案 1 :(得分:0)

朋友告诉我之前的问题:Setting JAVA_HOME when running Ant from Java

问题基本上是使用ant,因为它将java.home指向'jre'而不是'jdk'。每次蚂蚁被要求执行时都会被覆盖。

解决方案是添加:

fork="yes"

到每个编译脚本并添加:

p.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.6.0_26");

到java执行代码。

希望这有助于他人:D