5. Apache Ant использование внешних библиотек log4j и JUnit

Посмотрим как можно использовать внешние библиотеки такие как 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$

ant_15

где:

  • [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$

.

Комментарии

Чтобы оставить комментарий, необходимо Войти или Зарегистрироваться.