【问题标题】:Eclipse unable to compile ant script programmaticallyEclipse 无法以编程方式编译 ant 脚本
【发布时间】:2011-09-18 09:44:02
【问题描述】:

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

构建失败

X:\eclipseMT\runtime-workspace\testTest\diagram1_Sc2_TestScript.xml:68: 找不到 javac 编译器; com.sun.tools.javac.Main 不上 类路径。也许 JAVA_HOME 没有 指向JDK。目前已设置 到“C:\程序 文件\Java\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;
    }

【问题讨论】:

    标签: eclipse ant javac


    【解决方案1】:

    朋友给我参考一下这个早先的问题:Setting JAVA_HOME when running Ant from Java

    问题基本上出在 ant 上,因为它的 java.home 指向 'jre' 而不是 'jdk'。每次调用 ant 执行时它都会被覆盖。

    解决方法是添加:

    fork="yes"

    到每个编译脚本并添加:

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

    到java执行代码。

    希望这对其他人有所帮助:D

    【讨论】:

      【解决方案2】:

      它在抱怨 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),它应该可以工作。 :-)

      --纳格什·帕拉蒂亚

      【讨论】:

      • 嗨纳格什。我的 JAVA_HOME 已经设置为 JDK 路径。我有仔细检查它。是否有可能需要设置我的 Java 项目路径?谢谢..
      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多