2014-05-12 50 views
0

我遇到了這個問題,我的build.xml文件爲Android項目。目標覆蓋不按預期工作

我已經基本上從android SDKs build.xml文件中將「-compile」目標複製到我自己的build.xml文件中。但是,在運行ant時,它會繼續在Android SDK的build.xml文件中使用「-compile」目標而不是我的。我閱讀過的所有地方,包括我的build.xml文件的註釋,都表明這是目標覆蓋的工作方式,但由於某種原因,我的覆蓋目標未運行。

有什麼我需要做的嗎?

感謝幫助!

UPDATE

我專門做這個的-compile目標註釋掉<fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />線。

正如您在下面看到的那樣,有兩種不同的回聲語句。我一直在看到打印的sdk/tools/build.xml文件。另一個明顯的跡象是,構建失敗,因爲它沒有使用我的目標。

這裏是我的custom_rules.xml文件的目標

<target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile"> 
    <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..."> 
     <!-- merge the project's own classpath and the tested project's classpath --> 
     <path id="project.javac.classpath"> 
      <path refid="project.all.jars.path" /> 
      <path refid="tested.project.classpath" /> 
      <path path="${java.compiler.classpath}" /> 
     </path> 
     <javac encoding="${java.encoding}" 
       source="${java.source}" target="${java.target}" 
       debug="true" extdirs="" includeantruntime="false" 
       destdir="${out.classes.absolute.dir}" 
       bootclasspathref="project.target.class.path" 
       verbose="${verbose}" 
       classpathref="project.javac.classpath" 
       fork="${need.javac.fork}"> 
      <src path="${source.absolute.dir}" /> 
      <src path="${gen.absolute.dir}" /> 
      <compilerarg line="${java.compilerargs}" /> 
      <classpath> 
       <fileset dir="." includes="libs_ext/*.jar"/> 
      </classpath> 
     </javac> 

     <!-- if the project is instrumented, intrument the classes --> 
     <if condition="${build.is.instrumented}"> 
      <then> 
       <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo> 

       <!-- build the filter to remove R, Manifest, BuildConfig --> 
       <getemmafilter 
         appPackage="${project.app.package}" 
         libraryPackagesRefId="project.library.packages" 
         filterOut="emma.default.filter"/> 

       <!-- define where the .em file is going. This may have been 
        setup already if this is a library --> 
       <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" /> 

       <!-- It only instruments class files, not any external libs --> 
       <emma enabled="true"> 
        <instr verbosity="${verbosity}" 
          mode="overwrite" 
          instrpath="${out.absolute.dir}/classes" 
          outdir="${out.absolute.dir}/classes" 
          metadatafile="${emma.coverage.absolute.file}"> 
         <filter excludes="${emma.default.filter}" /> 
         <filter value="${emma.filter}" /> 
        </instr> 
       </emma> 
      </then> 
     </if> 

     <!-- if the project is a library then we generate a jar file --> 
     <if condition="${project.is.library}"> 
      <then> 
       <echo level="info">Creating library output jar file... CUSTOM_RULESXML</echo> 
       <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" /> 
       <if> 
        <condition> 
         <length string="${android.package.excludes}" trim="true" when="greater" length="0" /> 
        </condition> 
        <then> 
         <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo> 
        </then> 
       </if> 

       <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" /> 

       <jar destfile="${out.library.jar.file}"> 
        <fileset dir="${out.classes.absolute.dir}" 
          includes="**/*.class" 
          excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/> 
        <!--<fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />--> 
       </jar> 
      </then> 
     </if> 

    </do-only-if-manifest-hasCode> 
</target> 

這裏是SDK /工具/ build.xml文件相同的目標:

<target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile"> 
    <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping..."> 
     <!-- merge the project's own classpath and the tested project's classpath --> 
     <path id="project.javac.classpath"> 
      <path refid="project.all.jars.path" /> 
      <path refid="tested.project.classpath" /> 
      <path path="${java.compiler.classpath}" /> 
     </path> 
     <javac encoding="${java.encoding}" 
       source="${java.source}" target="${java.target}" 
       debug="true" extdirs="" includeantruntime="false" 
       destdir="${out.classes.absolute.dir}" 
       bootclasspathref="project.target.class.path" 
       verbose="${verbose}" 
       classpathref="project.javac.classpath" 
       fork="${need.javac.fork}"> 
      <src path="${source.absolute.dir}" /> 
      <src path="${gen.absolute.dir}" /> 
      <compilerarg line="${java.compilerargs}" /> 
     </javac> 

     <!-- if the project is instrumented, intrument the classes --> 
     <if condition="${build.is.instrumented}"> 
      <then> 
       <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo> 

       <!-- build the filter to remove R, Manifest, BuildConfig --> 
       <getemmafilter 
         appPackage="${project.app.package}" 
         libraryPackagesRefId="project.library.packages" 
         filterOut="emma.default.filter"/> 

       <!-- define where the .em file is going. This may have been 
        setup already if this is a library --> 
       <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" /> 

       <!-- It only instruments class files, not any external libs --> 
       <emma enabled="true"> 
        <instr verbosity="${verbosity}" 
          mode="overwrite" 
          instrpath="${out.absolute.dir}/classes" 
          outdir="${out.absolute.dir}/classes" 
          metadatafile="${emma.coverage.absolute.file}"> 
         <filter excludes="${emma.default.filter}" /> 
         <filter value="${emma.filter}" /> 
        </instr> 
       </emma> 
      </then> 
     </if> 

     <!-- if the project is a library then we generate a jar file --> 
     <if condition="${project.is.library}"> 
      <then> 
       <echo level="info">Creating library output jar file... SDK TOOLS BUILDXML</echo> 
       <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" /> 
       <if> 
        <condition> 
         <length string="${android.package.excludes}" trim="true" when="greater" length="0" /> 
        </condition> 
        <then> 
         <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo> 
        </then> 
       </if> 

       <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" /> 

       <jar destfile="${out.library.jar.file}"> 
        <fileset dir="${out.classes.absolute.dir}" 
          includes="**/*.class" 
          excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/> 
          <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" /> 
       </jar> 
      </then> 
     </if> 

    </do-only-if-manifest-hasCode> 
</target> 
+0

請發佈修改後的build.xml文件的相關部分。 –

回答

0

從默認覆蓋構建目標build.xml,你應該把你的自定義目標放在一個名爲custom_rules.xml的文件中。

+0

感謝您的回覆。因此,在build.xml文件中,註釋聲明如下: –

+0

感謝您的迴應。因此,在build.xml文件中,註釋聲明如下。爲什麼這不起作用? ! '< - 導入實際構建file.' '要自定義現有的目標,有兩種選擇:' - 自定義只有一個目標: - 複製/粘貼目標到該文件,*。*前的 任務。 - 根據您的需要定製它。' –

+0

嗨@ Code-Guru,所以我試着將目標移動到custom_rules.xml,它仍然沒有覆蓋目標。目標「-compile」總是從sdk/tools/build.xml文件運行,而不是我的custom_rules.xml文件。我可以清楚地看到這一點,因爲我在sdk/tools/build.xml文件中插入了語句,並且正在執行它。 –