1) білді антом після успішного проходження юніт тесту
2) автоматична генерація номера білда/допис дати/тощо з подальшим доступом до цих мета-даних білда з коду
Юніт тести виглядає цілком логічним проганяти перед кожним білдом, тому в антовському build.xml цілком логічно написати щось назразок:
- <target name="test" depends="compile-test">
- <junit failureProperty="tests.failed">
- <classpath refid="classpath.libs" />
- <classpath>
- <pathelement path="build"/>
- </classpath>
- <formatter type="brief" usefile="false" />
- <test name="my.own.TweetProducerTest" />
- </junit>
- </target>
* This source code was highlighted with Source Code Highlighter.
Де compile-test таска для компілу юніт-тестів, а "зміна" tests.failed слугує якраз для відслідковування вдалого проходження тест-кейсу. Лише за умови вдалого проходження тестів таска, що збирає джар:
- <target name="build" depends="test" unless="tests.failed">
- <antcall target="jar"/>
- </target>
* This source code was highlighted with Source Code Highlighter.
А ось і ця таска, описую також створення маніфесту
- <target name="jar" depends="compile">
- <delete file="tweet.jar"/>
- <property name="version.num" value="1.0"/>
- <tstamp>
- <format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
- </tstamp>
- <buildnumber file="build.num"/>
- <manifest file="MANIFEST.MF">
- <attribute name="Built-By" value="${user.name}"/>
- <attribute name="Implementation-Version"
- value="${version.num}-${build.number}"/>
- <attribute name="Built-Date" value="${TODAY}"/>
- </manifest>
- <jar destfile="tweet.jar"
- basedir="build"
- includes="**/*.class"
- excludes="**/*Test*.class"
- manifest="MANIFEST.MF"
- />
- </target>
* This source code was highlighted with Source Code Highlighter.
Цей код заслуговує на більш детальний розбір. Почнемо з кінця - створення джару - до нього пакуються усі класс-файли за викюченням тих, імена яких закінчуютсья на Test - це юніт-тести і вони нам не потрібні в нашій джарці.Загадковий
Найцікавішою частиною звісно є опис файлу маніфесту, який дозволяє нам задати наші додаткові атрибути. Імена атрибутів цілком описують їх значення... Файл маніфесту вийде приблизно таким:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 14.1-b02 (Sun Microsystems Inc.)
Build-By: kostya
Implementation-Version: 1.0-5
Build-Date: 2010-06-12 18:47:34
Для читання цих даних можна використати наступний код (Groovy):
Enumeratione = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF");
while (e.hasMoreElements()){
JarURLConnection jarConnection = (JarURLConnection)(e.nextElement().openConnection());
Manifest mf = jarConnection.getManifest();
Attributes attr = mf.getMainAttributes();
String libraryFor = attr.getValue("LibraryFor");
attr.getValue("Implementation-Version");
String version = attr.getValue("Implementation-Version");