Фильтрация источников перед компиляцией в NetBeans & Ant - PullRequest
0 голосов
/ 02 марта 2011

Мне нужно отфильтровать Java-файлы перед компиляцией, оставив исходные источники без изменений и компилируя из отфильтрованных (в основном, мне нужно установить дату сборки и тому подобное). Я использую NetBeans с его великолепными файлами сборки Ant.

Итак, однажды я обнаружил необходимость предварительной обработки исходных файлов перед компиляцией и столкнулся с большой проблемой. Нет, я не побежал в SO сразу, я провел некоторые исследования, но потерпел неудачу. Итак, вот моя грустная история ...

Я нашел опцию «filter» задачи «copy», переопределил macrodef «j2seproject3: javac» в файле build-impl.xml и добавил фильтр в его середине. Да, я получил желаемый результат, но теперь мои тесты не работают, поскольку они тоже используют этот макрос.

Затем я устал переопределять цель «-do-compile», копировать и фильтровать файлы в каталог build / temp-src и передавать аргумент нового исходного каталога в «j2seproject3: javac»:

<target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,
        -compile-depend,-prepare-sources"
        if="have.sources" name="-do-compile">
    <j2seproject3:javac gensrcdir="${build.generated.sources.dir}" srcdir="build/temp-src"/>
    <copy todir="${build.classes.dir}">
        <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
    </copy>
</target>

А теперь Ant говорит мне, что этого макроопределения не существует!

The prefix "j2seproject3" for element "j2seproject3:javac" is not bound.

Это странно, поскольку build-impl.xml содержит этот макрос, а build-impl.xml импортируется в основной файл сборки.

И, кстати, я не могу напрямую редактировать build-impl.xml, поскольку NetBeans переписывает его при каждой другой сборке.

Итак, мой вопрос: как я могу автоматически фильтровать источники перед компиляцией в NetBeans и не нарушать процесс сборки?

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Поскольку я нашел ответ, и, поскольку кажется, что никто не знает ответа, я опубликую свое решение.

build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Needed to add xmlns:j2seproject3 attribute, to be able to reference build-impl.xml macrodefs -->
<project name="Parrot" default="default" basedir="." xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3">
    <import file="nbproject/build-impl.xml"/>

    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml, -compile-depend,-prepare-sources" if="have.sources" name="-do-compile">
        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}" srcdir="build/temp-src"/>
        <copy todir="${build.classes.dir}">
            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
        </copy>
    </target>

    <!-- target to alter sources before compilation, you can add any preprocessing actions here -->
    <target name="-filter-sources" description="Filters sources to temp-src, setting the build date">
        <delete dir="build/temp-src" />
        <mkdir dir="build/temp-src" />
        <tstamp>
           <format property="build.time" pattern="yyyy-MM-dd HH:mm:ss"/>
        </tstamp>
        <filter token="build-time" value="${build.time}" />
        <copy todir="build/temp-src" filtering="true">
            <fileset dir="src">
                <filename name="**/*.java" />
            </fileset>
        </copy>
    </target>

</project>
1 голос
/ 03 марта 2011

Глядя на файл build.xml по умолчанию, он содержит комментарий, который гласит (частично):

There exist several targets which are by default empty and which can be 
used for execution of your tasks. These targets are usually executed 
before and after some main targets. They are: 

  -pre-init:                 called before initialization of project properties
  -post-init:                called after initialization of project properties
  -pre-compile:              called before javac compilation
  -post-compile:             called after javac compilation
  -pre-compile-single:       called before javac compilation of single file
  -post-compile-single:      called after javac compilation of single file
  -pre-compile-test:         called before javac compilation of JUnit tests
  -post-compile-test:        called after javac compilation of JUnit tests
  -pre-compile-test-single:  called before javac compilation of single JUnit test
  -post-compile-test-single: called after javac compilation of single JUunit test
  -pre-jar:                  called before JAR building
  -post-jar:                 called after JAR building
  -post-clean:               called after cleaning build products

Итак, чтобы внедрить некоторую обработку перед компиляцией, вы должны предоставить определение для -pre-compile.

FWIW, ошибка, которую вы получили, заключается в том, что префикс j2seprojectX определен в теге project файла build-impl.xml, а код в build.xml находится вне этого тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...