Посмотрим как можно использовать внешние библиотеки такие как Log4J и JUnit в связке с ant. Скачать библиотеку можно тут. Подключаемые внешние библиотеки будем хранить в директории ~/ant/lib. Скопируем библиотеку log4j-1.2.17.jar в ~/ant/lib.
roonyk@MacBookPro:~/ant/lib$pwd
/Users/roonyk/ant/lib
roonyk@MacBookPro:~/ant/lib$ls -l
total 960
-rw-r--r--@ 1 roonyk staff 489883 May 6 2012 log4j-1.2.17.jar
roonyk@MacBookPro:~/ant/lib$
Также необходимо будет изменить java код и build.xml файл.
Изменим java код в файле HelloWorld.java с:
package testant;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
на:
package testant;
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
public class HelloWorld {
static Logger logger = Logger.getLogger(HelloWorld.class);
public static void main(String[] args) {
BasicConfigurator.configure();
logger.info("Hello World");
}
}
Пока еще ничего не запускаем так как кроме ошибок компиляции ничего не получим – Log4J не включен в classpath. Для этого внесем изменения в build файл:
<project name="HelloWorld" basedir="." default="main">
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="testant.HelloWorld"/>
<property name="lib.dir" value="lib"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java fork="true" classname="${main-class}">
<classpath>
<path refid="classpath"/>
<path location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</java>
</target>
<target name="clean-build" depends="clean,jar"/>
<target name="main" depends="clean,run"/>
</project>
Запустив сейчас ant, получим такой вывод:
roonyk@MacBookPro:~/ant$ant
Buildfile: /Users/roonyk/ant/build.xml
clean:
[delete] Deleting directory /Users/roonyk/ant/build
compile:
[mkdir] Created dir: /Users/roonyk/ant/build/classes
[javac] Compiling 1 source file to /Users/roonyk/ant/build/classes
jar:
[mkdir] Created dir: /Users/roonyk/ant/build/jar
[jar] Building jar: /Users/roonyk/ant/build/jar/HelloWorld.jar
run:
[java] 0 [main] INFO testant.HelloWorld - Hello World
main:
BUILD SUCCESSFUL
Total time: 0 seconds
roonyk@MacBookPro:~/ant$
где:
- [java] Ant task запущенный в данный момент
- [main] поток с приложения
- INFO уровень логирования
- testant.HelloWorld источник сообщения
- - разделитель
- Hello World сообщение
Конфигурация для Log4J захардкожена в приложении. Вынесем конфигурацию в отдельный файл – ~/ant/src/log4j.properties. Также удалим из java кода следующие строки:
import org.apache.log4j.BasicConfigurator;
BasicConfigurator.configure();
В log4j.properties добавим следующие строки:
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%m%n
Также необходимо изменить build.xml файл <target name="compile"> с:
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false"/>
</target>
на:
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
<copy todir="${classes.dir}">
<fileset dir="${src.dir}" excludes="**/*.java"/>
</copy>
</target>
Это позволит скопировать все файлы не имеющие *.java суффикс в build директорию и jar архив.
Запустив ant получим:
roonyk@MacBookPro:~/ant$ant
Buildfile: /Users/roonyk/ant/build.xml
clean:
[delete] Deleting directory /Users/roonyk/ant/build
compile:
[mkdir] Created dir: /Users/roonyk/ant/build/classes
[javac] Compiling 1 source file to /Users/roonyk/ant/build/classes
[copy] Copying 1 file to /Users/roonyk/ant/build/classes
jar:
[mkdir] Created dir: /Users/roonyk/ant/build/jar
[jar] Building jar: /Users/roonyk/ant/build/jar/HelloWorld.jar
run:
[java] Hello World
[java] 0 [main] INFO testant.HelloWorld - Hello World
main:
BUILD SUCCESSFUL
Total time: 0 seconds
roonyk@MacBookPro:~/ant$
Теперь подключим библиотеку JUnit - junit-4.12.jar. Скачиваем и помещаем в директорию ~/ant/lib.
roonyk@MacBookPro:~/ant/lib$pwd
/Users/roonyk/ant/lib
roonyk@MacBookPro:~/ant/lib$ls -l
total 1576
-rw-r--r--@ 1 roonyk staff 314932 Jan 3 23:11 junit-4.12.jar
-rw-r--r--@ 1 roonyk staff 489883 May 6 2012 log4j-1.2.17.jar
roonyk@MacBookPro:~/ant/lib$
Создадим тестовый класс src/HelloWorldTest.java.
public class HelloWorldTest extends junit.framework.TestCase {
public void testNothing() {
}
public void testWillAlwaysFail() {
fail("Test ERROR message");
}
}
И отредактируем build.xml, итоговый вид которого ниже:
<project name="HelloWorld" basedir="." default="main">
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="testant.HelloWorld"/>
<property name="lib.dir" value="lib"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false"/>
<copy todir="${classes.dir}">
<fileset dir="${src.dir}" excludes="**/*.java"/>
</copy>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java fork="true" classname="${main-class}">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
<path location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</java>
</target>
<target name="junit" depends="jar">
<junit printsummary="yes">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
</classpath>
<batchtest fork="yes">
<fileset dir="${src.dir}" includes="*Test.java"/>
</batchtest>
</junit>
</target>
<target name="clean-build" depends="clean,jar"/>
<target name="main" depends="clean,run"/>
</project>
Запустим ant junit:
roonyk@MacBookPro:~/ant$ant junit
Buildfile: /Users/roonyk/ant/build.xml
compile:
jar:
junit:
[junit] Running HelloWorldTest
[junit] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0,002 sec
[junit] Test HelloWorldTest FAILED
BUILD SUCCESSFUL
Total time: 0 seconds
roonyk@MacBookPro:~/ant$
Можно также сгенерировать отчет, junit таск создаст XML отчет, junitreport создаст HTML отчет. Подправим build.xml файл:
<project name="HelloWorld" basedir="." default="main">
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="testant.HelloWorld"/>
<property name="lib.dir" value="lib"/>
<property name="report.dir" value="${build.dir}/junitreport"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false"/>
<copy todir="${classes.dir}">
<fileset dir="${src.dir}" excludes="**/*.java"/>
</copy>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java fork="true" classname="${main-class}">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
<path location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</java>
</target>
<target name="junit" depends="jar">
<mkdir dir="${report.dir}"/>
<junit printsummary="yes">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes" todir="${report.dir}">
<fileset dir="${src.dir}" includes="*Test.java"/>
</batchtest>
</junit>
</target>
<target name="junitreport">
<junitreport todir="${report.dir}">
<fileset dir="${report.dir}" includes="TEST-*.xml"/>
<report todir="${report.dir}"/>
</junitreport>
</target>
<target name="clean-build" depends="clean,jar"/>
<target name="main" depends="clean,run"/>
</project>
После запуска тасков:
roonyk@MacBookPro:~/ant$ant junit
Buildfile: /Users/roonyk/ant/build.xml
compile:
jar:
junit:
[mkdir] Created dir: /Users/roonyk/ant/build/junitreport
[junit] Running HelloWorldTest
[junit] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0,039 sec
[junit] Test HelloWorldTest FAILED
BUILD SUCCESSFUL
Total time: 0 seconds
roonyk@MacBookPro:~/ant$
roonyk@MacBookPro:~/ant$ant junitreport
Buildfile: /Users/roonyk/ant/build.xml
junitreport:
[junitreport] Processing /Users/roonyk/ant/build/junitreport/TESTS-TestSuites.xml to /var/folders/lk/xhxm0n8s7l136r03jsy5mfxr0000gn/T/null215177667
[junitreport] Loading stylesheet jar:file:/usr/local/apache-ant-1.9.6/lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl
[junitreport] Transform time: 359ms
[junitreport] Deleting: /var/folders/lk/xhxm0n8s7l136r03jsy5mfxr0000gn/T/null215177667
BUILD SUCCESSFUL
Total time: 0 seconds
roonyk@MacBookPro:~/ant$
увидим что в ~/ant/build/junitreport/ были созданы отчеты:
roonyk@MacBookPro:~/ant/build/junitreport$pwd
/Users/roonyk/ant/build/junitreport
roonyk@MacBookPro:~/ant/build/junitreport$ls -l
total 176
-rw-r--r-- 1 roonyk staff 10225 Mar 19 20:09 0_HelloWorldTest-fails.html
-rw-r--r-- 1 roonyk staff 10354 Mar 19 20:09 0_HelloWorldTest.html
-rw-r--r-- 1 roonyk staff 7671 Mar 19 20:09 TEST-HelloWorldTest.xml
-rw-r--r-- 1 roonyk staff 8292 Mar 19 20:09 TESTS-TestSuites.xml
-rw-r--r-- 1 roonyk staff 1487 Mar 19 20:09 all-tests.html
-rw-r--r-- 1 roonyk staff 452 Mar 19 20:09 allclasses-frame.html
-rw-r--r-- 1 roonyk staff 832 Mar 19 20:09 alltests-errors.html
-rw-r--r-- 1 roonyk staff 1252 Mar 19 20:09 alltests-fails.html
-rw-r--r-- 1 roonyk staff 834 Mar 19 20:09 alltests-skipped.html
-rw-r--r-- 1 roonyk staff 676 Mar 19 20:09 index.html
-rw-r--r-- 1 roonyk staff 526 Mar 19 20:09 overview-frame.html
-rw-r--r-- 1 roonyk staff 1898 Mar 19 20:09 overview-summary.html
-rw-r--r-- 1 roonyk staff 588 Mar 19 20:09 package-frame.html
-rw-r--r-- 1 roonyk staff 1234 Mar 19 20:09 package-summary.html
-rw-r--r-- 1 roonyk staff 912 Mar 19 20:09 stylesheet.css
roonyk@MacBookPro:~/ant/build/junitreport$
.
Комментарии