Динамически генерировать JAR-файлы на основе имени пакета с помощью ANT - PullRequest
0 голосов
/ 30 мая 2009

Мой текущий файл сборки имеет следующие повторяющиеся задачи:

<jar jarfile="${build.lib}/${prefix}-foo.jar">
    <fileset dir="${build.classes}">
        <include name="com/a/c/foo/**"/>
    </fileset>  
</jar>
<jar jarfile="${build.lib}/${prefix}-bar.jar">
    <fileset dir="${build.classes}">
        <include name="com/a/c/bar/**"/>
    </fileset>
</jar>

... и т. Д. Проблема в том, что build.xml должен быть изменен для каждого нового пакета или для каждого нового подпроекта. Это частое явление, когда я работаю.

Я хотел бы заменить это логикой, которая будет динамически генерировать JAR-файлы и имена их файлов на основе «корневого» пакета. Так, например, я мог бы установить корневой пакет равным com / a / c, и все пакеты непосредственно под этим пакетом получили бы свой собственный JAR. Обратите внимание, что все пакеты в «foo» или «bar» будут просто частью «foo.jar» или «bar.jar».

Я искал задачи логики цикла для ANT. Я нашел один в каждом ant-contrib и JWare / AntXtras, но я не смог заставить их работать так, как хотелось бы.

Ответы [ 2 ]

4 голосов
/ 30 мая 2009

Я не знаю про цикл и поиск всех имен пакетов, но вы можете использовать макрос, чтобы избежать дублирования кода.

Я не пробовал, но это может сработать

<macrodef name="build_jar">
    <attribute name="name"/>
    <sequential>
        <jar jarfile="${build.lib}/${prefix}-@{name}.jar">
            <fileset dir="${build.classes}">
                <include name="com/a/c/@{name}/**"/>
            </fileset>
        </jar>
    </sequential
</macrodef>

<target name="build_foo">
    <build_jar name="foo"/>
</target>

<target name="build_bar">
    <build_jar name="bar"/>
</target>
1 голос
/ 05 июня 2009

Как насчет этого:

<project name="dynjar" default="jar" basedir=".">
    <property name="build.classes" value="${basedir}/classes"/>
    <property name="build.lib" value="${basedir}/lib"/>
    <property name="prefix" value="prefix"/>
    <property name="root" value="com/a/c"/>

    <target name="jar">
        <!-- ${ant.file} is the name of the current build file -->
        <subant genericantfile="${ant.file}" target="do-jar">

            <!-- Pass the needed properties to the subant call. You could also use
                 the inheritall attribute on the subant element above to pass all
                 properties. -->
            <propertyset>
                <propertyref name="build.classes"/>
                <propertyref name="build.lib"/>
                <propertyref name="prefix"/>
                <propertyref name="root"/>
            </propertyset>

            <!-- subant will call the "do-jar" target for every directory in the
                 ${build.classes}/${root} directory, making the subdirectory the
                 basedir. -->
            <dirset dir="${build.classes}/${root}" includes="*"/>
        </subant>
    </target>

    <target name="do-jar">
        <!-- Get the basename of the basedir (foo, bar, etc.) -->
        <basename file="${basedir}" property="suffix"/>

        <jar jarfile="${build.lib}/${prefix}-${suffix}.jar">
            <fileset dir="${build.classes}">
                <include name="${root}/${suffix}/**"/>
            </fileset>
        </jar>
    </target>
</project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...