Date: 2004-02-28T18:08:03 Editor: 218.214.49.176 <> Wiki: Ant Wiki Page: AntUtil URL: http://wiki.apache.org/ant/AntUtil
no comment New Page: == Preface == After doing things over and over I usually intend to automate that. In earlier time I wrote (windows) batch files. But since some months sometimes I do that with Ant. Sometimes also things Ant was never designed for ... == Installation == On my machine I have a directory c:\bin which is listed in the %PATH% variable, so I can invoke shell command whereever I am. The AntUtil contains several files: the buildfile, the batchfile and an optional propertyfile. Additionally some targets require template files. == antutil.bat == {{{ rem Simply invoke Ant and store the currend directory as Ant property. @echo off ant -buildfile c:\bin\antutil.xml %* -DcurDir="%CD%" }}} == antutil.properties == {{{ # used to save common settings # on my machine empty }}} == antutil.xml == {{{ <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Here the work is done :-) --> <project name="antutil" default="usage"> <!-- I use AntContrib on several places --> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <!-- the directory where antutil was invoked --> <property name="curDir" value="."/> <!-- load the common properties --> <property file="antutil.properties"/> <target name="zip" description="Create a zip-file with files listed in files2zip.txt"> <property name="zipname" value="zipname"/> <property name="files2zip" value="files2zip.txt"/> <!-- Ant waits for finishing notepad, which I want here. --> <echo>Start Notepad and wait for its end.</echo> <exec executable="notepad.exe"><arg value="${files2zip}"/></exec> <echo>Create ZIP-File ${zipname}.zip</echo> <zip destfile="${curDir}/${zipname}.zip" basedir="${curDir}" excludes="${zipname}.zip" includesfile="${files2zip}" /> </target> <!-- this is the 'user front end' for target mget --> <target name="download" description="Download files listed in a textfile"> <property name="filelist" value="files2load.txt"/> <!-- Ant waits for finishing notepad, which I want here. --> <echo>Start Notepad and wait for its end.</echo> <echo file="${curDir}/${filelist}" message="uri=dest"/> <exec executable="notepad.exe"><arg value="${curDir}/${filelist}"/></exec> <echo>Load files</echo> <antcall target="mget"/> <delete file="${curDir}/${filelist}"/> </target> <!-- mget needs a file with uri=dest pairs to download --> <target name="mget" description="download multiple files" if="filelist"> <!-- Network configuration --> <property name="proxy.host" value="MyProxy" /> <property name="proxy.port" value="8080" /> <setproxy proxyHost="${proxy.host}" proxyPort="${proxy.port}"/> <!-- Load the files --> <loadfile property="files" srcFile="${curDir}/${filelist}"/> <foreach target="sget" param="value" list="${files}" delimiter="${line.separator}" parallel="true"/> </target> <!-- load a single file --> <target name="sget" if="value"> <!-- split a line http://server/dir/file.txt=c:/temp/newfile.txt into uri (http://...) and dest (c:/...) <propertyregex property="uri" input="${value}" regexp="(.*)=(.*)" select="\1"/> <propertyregex property="dest" input="${value}" regexp="(.*)=(.*)" select="\2"/> <!-- check whether a destination filename is there. Otherwise use the same filename in the dest-directory --> <script language="javascript"> <![CDATA[ importClass(java.io.File); dest = new File(project.getProperty("dest")); if (dest.isDirectory()) { destDir = dest; uri = project.getProperty("uri"); uri = uri.substring(uri.lastIndexOf("/")+1); destFile = new File(destDir, uri); } else { destDir = dest.getParent(); destFile = dest; } project.setProperty("destDir", destDir); project.setProperty("destFile", destFile); ]]></script> <!-- get needs an existing dest-dir --> <mkdir dir="${destDir}"/> <get src="${uri}" dest="${destFile}" /> </target> <!-- create a small sample project file --> <target name="mkproject" description="Erzeugt eine kleine build.xml"> <copy file="buildxml.xml-template-small.xml" tofile="${curDir}/build.xml"/> </target> <target name="mkp" depends="mkproject"/> <!-- create a big build environment --> <!-- read initial project data from file --> <target name="create-read" if="create.file"> <property file="${curDir}/${create.file}"/> <echo message="Propertyfile: ${create.file}"/> <echo message="Project Name: ${prj.name}"/> <echo message="Ant-Common : ${ant.common}"/> </target> <!-- ask the user for initial project data --> <target name="create-input" unless="create.file"> <echo>Please enter some required data for generating the files:</echo> <input addproperty="prj.name" message="project name:"/> <property name="antcommon.default" value="c:/seu/ant-common"/> <input addproperty="antcommon.tmp" message="Please input [default: '${antcommon.default}']:"/> <condition property="ant.common" value="${antcommon.tmp}"> <not><equals arg1="" arg2="${antcommon.tmp}"/></not> </condition> <property name="ant.common" value="${antcommon.default}"/> <!--<input addproperty="ant.common" message="directory containing ant-snippets:"/>--> <echo message="Project Name: ${prj.name}"/> <echo message="Ant-Common : ${ant.common}"/> </target> <!-- do the work --> <target name="create" depends="create-read,create-input"> <property name="template.buildxml" value="buildxml.xml-template.xml"/> <property name="template.buildproperties" value="buildxml.prop-template.properties"/> <property name="template.bat" value="buildxml.bat-template.txt"/> <!-- create build.xml --> <copy tofile="${curDir}/build.xml" file="${template.buildxml}"> <filterchain id="replace.filter"> <replacetokens> <token key="projectName" value="${prj.name}"/> <token key="AntCommonDir" value="${ant.common}"/> </replacetokens> </filterchain> </copy> <!-- create build.properties --> <copy tofile="${curDir}/build.properties" file="${template.buildproperties}"> <filterchain refid="replace.filter"/> </copy> <!-- create create.txt for creation of buildenvironment whithout typing in the data again --> <copy tofile="${curDir}/create.bat" file="${template.bat}"> <filterchain refid="replace.filter"/> </copy> </target> <target name="help" depends="usage"/> <target name="usage"> <echo> zip Open Notepad and zip all pattern -Dzipname name of the zipfile (without suffif) in curDir -Dfiles2zip name of pattern file create Create a build.xml and build.properties mkp, mkproject Create a small build.xml for tests download Open Notepad and load all specified files (URI=dest). </echo> </target> </project> == buildxml.xml-template-small.xml == <?xml version="1.0" encoding="ISO-8859-1"?> <project name="test" basedir="." default="main"> <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <target name="main"> </target> <target name="script"> <script language="javascript"> <![CDATA[ // import statements importPackage(java.text); importClass(java.io.File); ]]></script> </target> </project> == buildxml.bat-template.txt == @echo off echo [EMAIL PROTECTED]@>create.txt echo [EMAIL PROTECTED]@>>create.txt call antutil -Dcreate.file=create.txt create del create.txt == buildxml.prop-template.properties == # Property file for @projectName@ #------------------------------------------------------------------------------ # Version of the program version=1.0 # Directory settings # # Suggestions of "Java Development with Ant" - Appendix D - p.551 # for directory structure (used by target 'seed'). # Additionals from Appendix D: p.558 (test specific) #---------------------------------------------------------------- # Temporary staging area for classes and more build.dir=build # Directory containing java *.class files and resources, ready for packaging. build.classes.dir=${build.dir}/classes # Directory for junit test classes and resources, ready for runned by junit. test.classes.dir=${build.dir}/test # Distribution directory dist.dir=dist # Documentation files stored in their presentation formats docs.dir=docs # Sample files etc.dir=etc # Project dependencies, typically third-party .jar files lib.dir=lib # Root directory of all Sources src.dir=src # Directory for application: Java source code, package directory below # whithout test file # # Adapted from Antīs own buildfile java.dir=${src.dir}/main # Directory where the JUnit-Tests lie. test.src.dir=${src.dir}/test/junit # Directory for test data, e.g. input data and expected results test.data.dir=${src.dir}/test/data # Documentation in XML format, to be transformed into presentation # format during the build process xdocs.dir=${src.dir}/xdocs # Metadata for the JAR file metainf.dir=${src.dir}/META-INF # Root directory of web content (.html, .jpg, .JSP) web.dir=${src.dir}/web # Web deployment information, such as web.xml webinf.dir=${web.dir}/WEB-INF # Directory containing license files of the application and 3rd party libraries license.dir=licenses # Build-specific properties #---------------------------------------------------------------- # Settings for java compiler (see manual for <javac>) javac.debug=off javac.deprecation=off javac.target=1.2 javac.optimize=off javac.compiler=modern # Name of the JAR file containing the application application.jar=${ant.project.name}-${version}.jar application.tests.jar=${ant.project.name}-${version}-tests.jar application.manifest=${metainf.dir}/application.mf # Name of the DIST-File (without suffix) dist.filename=${ant.project.name}-${version}-${DSTAMP}-${TSTAMP} # Who should create the JavaDoc? # JDK - javadoc tool from current JDK (default) # XDoclet - XDocletīs javadoc capabilities #javadocs.kind=JDK javadocs.dir=${build.dir}/api javadocs.titel=${ant.project.name} #copyright.text=All rights reserved. # Test-specific properties #---------------------------------------------------------------- # test.classes.dir: set in "Directory settings" # test.src.dir: set in "Directory settings" # Should JUnit use another JVM junit.fork=true # If the value is set, the build will fail if one testcase failes. #test.halt-if-failed= # Where is JUnit? # See library settings #junit.jar= # Where is the XML output of JUnit runs junit.out.dir.xml=${build.dir}/junit-xml # Where should the HTML report generated by <junitreport> junit.out.dir.html=${build.dir}/junit-html # Library settings #---------------------------------------------------------------- junit.jar=${lib.dir}/junit.jar log4j.jar=${lib.dir}/log4j.jar == buildxml.xml-template.xml == <?xml version="1.0" encoding="ISO-8859-1"?> <project name="@projectName@" basedir="." default="main"> <description> Something about the project. </description> <import file="@AntCommonDir@/all.xml"/> <!-- ====================================================================== --> <!-- Properties --> <!-- ====================================================================== --> <!-- ====================================================================== --> <!-- task declarations --> <!-- ====================================================================== --> <!-- ====================================================================== --> <!-- Datatype declarations --> <!-- ====================================================================== --> <path id="compile.classpath"> <!-- contains all runtime libraries --> <path location="${log4j.jar}"/> </path> <property name="compile.cp" refid="compile.classpath"/> <path id="test.classpath"> <path refid="compile.classpath"/> <path location="${junit.jar}"/> <path location="${build.classes.dir}"/> <path location="${test.classes.dir}"/> </path> <property name="test.cp" refid="test.classpath"/> <!-- ====================================================================== --> <!-- Default target --> <!-- ====================================================================== --> <target name="main" depends="all" description="Default target, calls 'all'" /> <target name="all" depends="dist,test" description="Build and test everything; create a distribution" /> <!-- ====================================================================== --> <!-- Build / compile / test targets --> <!-- ====================================================================== --> <target name="compile" depends="" description="compiles the sources"> <mkdir dir="${build.classes.dir}"/> <javac srcdir="${java.dir}" destdir="${build.classes.dir}" debug="${javac.debug}" deprecation="${javac.deprecation}" target="${javac.target}" optimize="${javac.optimize}" compiler="${javac.compiler}"> <classpath refid="compile.classpath"/> </javac> </target> <target name="archive" depends="jar"/> <target name="jar" depends="compile" description="Jars the classes"> <mkdir dir="${dist.dir}"/> <jar destfile="${dist.dir}/${application.jar}" basedir="${build.classes.dir}" excludes="**/*Test.class **/*TestCase.class" manifest="${application.manifest}" /> </target> <target name="compile-tests" depends="" description="compiles test sources"> <mkdir dir="${test.classes.dir}"/> <javac srcdir="${test.src.dir}" destdir="${test.classes.dir}" debug="${javac.debug}" deprecation="${javac.deprecation}" target="${javac.target}" optimize="${javac.optimize}" compiler="${javac.compiler}"> <classpath refid="test.classpath"/> </javac> </target> <target name="jar-tests" depends="compile-tests" description="Jars the testcases"> <mkdir dir="${dist.dir}"/> <jar destfile="${dist.dir}/${application.tests.jar}" basedir="${test.classes.dir}" includes="**/*Test.class **/*TestCase.class" manifest="${application.manifest}" /> </target> <target name="junit" depends="compile-tests" description="run the 'testcase'-specified or all unit tests"> <!-- see "Java Development with Ant" - Appendix D - pp.558 --> <copy todir="${test.classes.dir}"> <fileset dir="${test.src.dir}" excludes="**/*.java" /> </copy> <mkdir dir="${junit.out.dir.xml}"/> <junit printsummary="no" errorProperty="test.failed" failureProperty="test.failed" fork="${junit.fork}"> <classpath refid="test.classpath" /> <sysproperty key="docs.dir" value="${test.classes.dir}"/> <formatter type="xml"/> <test name="${testcase}" if="testcase" /> <batchtest todir="${junit.out.dir.xml}" unless="testcase"> <fileset dir="${test.classes.dir}" includes="**/*Test.class" /> </batchtest> </junit> </target> <!-- Implementation, if no XML-Include would chosen. --> <target name="junitreport" depends="" description="Format the JUnit-Result"> <mkdir dir="${junit.out.dir.html}" /> <junitreport todir="${junit.out.dir.html}"> <fileset dir="${junit.out.dir.xml}"> <include name="*.xml"/> </fileset> <report format="frames" todir="${junit.out.dir.html}"/> </junitreport> </target> <target name="test" depends="junit,junitreport" description="Run the unit tests and format the result"> <condition property="test.fail"> <and> <isset property="test.failed" /> <isset property="test.halt-if-failed" /> </and> </condition> <fail if="test.fail"> Unit tests failed. Check log or reports for details. </fail> </target> <!-- ====================================================================== --> <!-- Documentation targets --> <!-- ====================================================================== --> <target name="docs" depends="javadocs,printerdocs" description="Generate all documentation"> </target> <target name="javadocs" depends="" description="Generate the Javadoc pages"> <mkdir dir="${javadocs.dir}" /> <condition property="bottom.text1" value="Copyright © ${YEAR} ${copyright.text}<br>"> <and> <not><equals arg1="" arg2="${copyright.text}"/></not> <isset property="copyright.text"/> </and> </condition> <property name="bottom.text1" value=""/> <javadoc destdir="${javadocs.dir}" classpath="${compile.cp}" author="true" version="true" use="true" Splitindex="false" access="protected" windowtitle="${javadocs.titel} API"> <fileset dir="${java.dir}" defaultexcludes="yes"> <include name="**/*.java" /> </fileset> <doctitle><![CDATA[<h1>${javadocs.titel}</h1>]]></doctitle> <bottom><![CDATA[<i>${bottom.text1}Generated: ${DATE} ${TIME}</i> ]]></bottom> <tag name="todo" scope="all" description="To do:" /> </javadoc> </target> <target name="printerdocs" depends="" description="Generate printable documents"> <echo message="Target 'printerdocs' not yet implemented."/> </target> <target name="todo" depends="" description="Creates a ToDo-List"> <!-- see "Java Development with Ant" - Ch.11 XDoclet p.262 --> <property name="xdoclet.home" value="C:/ZipDrive/02/XDoclet/xdoclet-bin-1.2b2/lib"/> <path id="xdoclet.classpath"> <fileset dir="${xdoclet.home}"> <include name="log4j.jar"/> <include name="xdoclet-1.2b2.jar"/> <include name="*.jar"/> <!-- <include name=""/> <include name=""/> <include name=""/> --> </fileset> </path> <taskdef name="document" classname="xdoclet.doc.DocumentDocletTask" classpathref="xdoclet.classpath"/> <document sourcepath="${src.dir}" destdir="${build.dir}/todo" classpathref="xdoclet.classpath"> <fileset dir="${src.dir}"> <include name="**/*.java"/> </fileset> <info header="To-do list" projectname="${ant.project.name}" tag="todo" /> </document> </target> <!-- ====================================================================== --> <!-- Distribution / install targets --> <!-- ====================================================================== --> <target name="deploy" depends="" description="Deploy the code"> <!-- usually to a remote server --> <echo message="Target 'deploy' not yet implemented."/> </target> <target name="dist" depends="jar,jar-tests,docs" description="Produce the distribution"> <zip destfile="${dist.dir}/${dist.filename}.zip"> <fileset dir="${dist.dir}"> <include name="${application.jar}"/> <include name="${application.tests.jar}"/> </fileset> <zipfileset dir="${javadocs.dir}" prefix="api"/> <!-- @TODO: add the printerdocs and anything else you want --> </zip> <tar destfile="${dist.dir}/${dist.filename}.tar"> <tarfileset dir="${dist.dir}"> <include name="${application.jar}"/> <include name="${application.tests.jar}"/> </tarfileset> <tarfileset dir="${javadocs.dir}" prefix="api"/> </tar> <gzip src="${dist.dir}/${dist.filename}.tar" zipfile="${dist.dir}/${dist.filename}.tar.gz"/> <bzip2 src="${dist.dir}/${dist.filename}.tar" zipfile="${dist.dir}/${dist.filename}.tar.bz2"/> <checksum> <fileset dir="${dist.dir}"/> </checksum> </target> <target name="distclean" depends="" description="Clean up the distribution files only"> <delete includeEmptyDirs="true"> <fileset dir="${dist.dir}" /> </delete> </target> <target name="install" depends="" description="Perform a local installation"> <echo message="Target 'install' not yet implemented."/> </target> <target name="uninstall" depends="" description="Remove a local installation"> <echo message="Target 'uninstall' not yet implemented."/> </target> <!-- ====================================================================== --> <!-- Internal targets --> <!-- ====================================================================== --> <target name="clean" depends="" description="Delete all generated files and directories"> <delete includeEmptyDirs="true" failonerror="false"> <fileset dir="${build.dir}" /> <fileset dir="${dist.dir}" /> <fileset dir="${docs.dir}" /> </delete> </target> <target name="seed" depends="" description="Creates the directory structure"> <!-- see "Java Development with Ant" - Appendix D - p.551 --> <mkdir dir="${build.dir}"/> <mkdir dir="${javadocs.dir}"/> <mkdir dir="${junit.out.dir.xml}"/> <mkdir dir="${junit.out.dir.html}"/> <mkdir dir="${src.dir}"/> <mkdir dir="${java.dir}"/> <mkdir dir="${test.src.dir}"/> <mkdir dir="${docs.dir}"/> <mkdir dir="${etc.dir}"/> <mkdir dir="${lib.dir}"/> <mkdir dir="${xdocs.dir}"/> <mkdir dir="${metainf.dir}"/> <mkdir dir="${web.dir}"/> <mkdir dir="${webinf.dir}"/> <mkdir dir="${build.dir}"/> <mkdir dir="${dist.dir}"/> <mkdir dir="${build.classes.dir}"/> <mkdir dir="${test.classes.dir}"/> <mkdir dir="${license.dir}"/> <mkdir dir="${test.data.dir}"/> <manifest file="${application.manifest}"> <section name="Build"> <attribute name="Built-By" value="${user.name}"/> <attribute name="Built-date" value="${DSTAMP}-${TSTAMP}"/> </section> <section name="${ant.project.name}"> <attribute name="Version" value="${version}"/> </section> <!-- Package version info (see java.sun.com/<manifest>-manual) --> <section name="common"> <attribute name="Specification-Title" value="spec-title"/> <attribute name="Specification-Version" value="${version}"/> <attribute name="Specification-Vendor" value="${user.name}"/> <attribute name="Implementation-Title" value="common"/> <attribute name="Implementation-Version" value="${version} ${TODAY}"/> <attribute name="Implementation-Vendor" value="${user.name}"/> </section> </manifest> <echo file="${license.dir}/license.${ant.project.name}.txt" message="License for ${ant.project.name}"/> <!-- Create JBuilder projectfile JPX --> </target> <target name="example" depends="seed" description="creates an example application"> <!-- unzip the files from example.zip into the configured directories --> </target> <target name="usage"> <echo message="Execute 'ant -projecthelp' for build file help."/> <echo message="Execute 'ant -help' for Ant help."/> <echo message=" " /> <echo message="Additional target specific information:"/> <echo message=" test, junit: -Dtestcase=<classname> forces to run only that testcase"/> <!-- <echo message="Executing 'ant -help'" /> <exec executable="ant.bat" taskname="help"><arg value="-help"/></exec> <echo message="Executing 'ant -projecthelp'" /> <exec executable="ant.bat" taskname="proj-help"><arg value="-projecthelp"/></exec> --> </target> <target name="help" depends="usage"/> <target name="debug"> <echoproperties/> </target> </project> }}} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]