2011-06-20 197 views
2

我有一个Ant脚本,我想使用我制作的按钮执行。现在的问题是,我会得到一个错误说:Eclipse无法编程编译ant脚本

构建失败

X:\ eclipseMT \运行时的工作区\ TESTTEST \ diagram1_Sc2_TestScript.xml:68: 无法找到javac编译器; com.sun.tools.javac.Main不在 类路径中。也许JAVA_HOME不指向JDK 。它当前设置 到“C:\ PROGRAM 文件\的Java \ jdk1.6.0_12 \ jre的”

我敢肯定,我的类路径是正确的,我可以使用Eclipse的Ant内部执行相同的脚本遗嘱执行人。

这是我的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; 
    } 

回答

0

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

问题basicly是蚂蚁,因为它指向java.home为“JRE”,而不是'JDK'。每次调用ant时,它都会被覆盖。

的解决方案是增加:

fork="yes"

到每个编译脚本并添加:

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

到Java执行代码。

希望这可以帮助其他人:D

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

+0

嗨Nagesh。我的JAVA_HOME已经被设置为JDK路径。我仔细检查了一下。是否有可能需要设置我的Java项目路径?谢谢.. – Iso