2009-05-30 11 views
0

Моего текущим файлом сборка имеет следующие повторяющиеся задачи:Динамически генерировать JAR-файлы на основе имени пакета с ANT

<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, но я не мог заставить себя работать по своему желанию.

+0

Это похоже на своего рода странное требование. Можете ли вы подробнее рассказать о том, почему одна банка не подходит для ваших целей? – Jherico

+0

Согласен, это определенно не в левом поле. У нас есть «базовая кувшин» для всей общей apis. Оттуда каждый JAR может быть помещен в другую среду linux с базовой банкой. Кроме того, большинство наших клиентов хотят заменить одну или две банки, содержащие небольшую часть приложения, вместо замены всего. – 2009-05-30 03:54:12

ответ

4

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

Я не пробовал это, но она могла бы работать

<macrodef name="build_jar"> 
    <attribute name="name"/> 
    <sequential> 
     <jar jarfile="${build.lib}/${prefix}[email protected]{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

Как об этом:

<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> 
+0

Я использую это для создания своих банок, но у меня есть проблема. Можете ли вы мне помочь [здесь] (http://stackoverflow.com/questions/23075813/adding-packages-to-jars)? –

Смежные вопросы