переопределение цели не работает должным образом

У меня возникла проблема с моим файлом build.xml для проекта Android.

В основном я скопировал цель «-compile» из файла build.xml SDK Android в свой собственный файл build.xml. Однако при запуске ant он продолжает использовать цель «-compile» в файле build.xml Android SDK вместо моего. Везде, где я читал, включая комментарии к моему файлу build.xml, говорится, что именно так работает переопределение цели, но по какой-то причине моя переопределенная цель не работает.

Есть ли что-то еще, что мне нужно сделать?

Цените помощь!

ОБНОВЛЕНИЕ:

Я делаю это специально, чтобы закомментировать строку <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" /> в цели -compile.

Как вы можете видеть ниже, есть два разных оператора echo. Я продолжаю видеть тот, что печатается в 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/tools/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>

person Ashok SoThree    schedule 12.05.2014    source источник
comment
Пожалуйста, опубликуйте соответствующие части вашего измененного файла build.xml.   -  person Code-Apprentice    schedule 13.05.2014


Ответы (1)


Чтобы переопределить цели сборки по умолчанию build.xml, вы должны поместить свои пользовательские цели в файл с именем custom_rules.xml.

person Code-Apprentice    schedule 12.05.2014
comment
Спасибо за ответ. Итак, в файле build.xml комментарии гласят следующее: - person Ashok SoThree; 13.05.2014
comment
Спасибо за ответ. Итак, в файле build.xml комментарии гласят следующее. Почему это не работает? <!-- Import the actual build file. To customize existing targets, there are two options: - Настроить только одну цель: - скопировать/вставить цель в этот файл перед задачей ‹импорта›. - настроить его в соответствии с вашими потребностями.` - person Ashok SoThree; 13.05.2014
comment
Привет @Code-Guru, я попытался переместить цель в custom_rules.xml, и она все еще не переопределяет цель. Целевой компилятор всегда запускается из файла sdk/tools/build.xml вместо моего файла custom_rules.xml. Я ясно вижу это, когда вставляю оператор ‹echo /› в файл sdk/tools/build.xml, и он выполняется. - person Ashok SoThree; 13.05.2014