2014-05-12 48 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文件中插入了语句,并且正在执行它。 –