I've been trying for a very long time now (many man-days) to create Ant
build scripts to handle our new corporate project.

I've been using Ant for over 3 years, and programming professionally for
over 25 years.

Despite all that, I cannot seem to get Ant to do what we need on this
project.  I am becoming extremely frustrated and disillusioned with Ant
as a build tool.  Yet in my heart I feel like there is an elegant
solution.

Perhaps some gurus can enlighten me?
 _  _  _  _  _  _  _

Our project has a pretty basic layout:

  dev/foo/build.xml
  dev/foo/config/runtime.properties
  dev/foo/config/log4j.properties
  dev/foo/lib/
  dev/foo/log/
  dev/foo/src/cpp/...
  dev/foo/src/java/com/company/foo/admin/
  dev/foo/src/java/com/company/foo/db/
  dev/foo/src/java/com/company/foo/controller/
  dev/foo/src/java/com/company/foo/util/

Note the (as-yet undefined) src/cpp/ subtree for C++ code.

Here is a sample layout for one of the java package directories:

  dev/foo/src/java/com/company/foo/util/build.xml
  dev/foo/src/java/com/company/foo/util/DbUtils.java
  dev/foo/src/java/com/company/foo/util/StringUtils.java
  dev/foo/src/java/com/company/foo/util/classes/
  dev/foo/src/java/com/company/foo/util/javadoc/
  dev/foo/src/java/com/company/foo/util/test/testAll
  dev/foo/src/java/com/company/foo/util/test/testDbUtils.java
  dev/foo/src/java/com/company/foo/util/test/testStringUtils.java

Our team needs to be able to use the following Ant targets from within
ANY of the top-level java package directories (xxx = one of these
package names:  admin, db, controller, and util):

  compile - compile .java into .class files which are put into
            company/foo/xxx/classes/ for package xxx only.

  build - create lib/xxx.jar (containing non-test files) and
          create lib/xxx-test.jar (containint test-only files);
          depends on compile.

  test - run unit tests for package xxx; depends on build.

  javadoc - put javadoc for package xxx only into the
            company/foo/xxx/javadoc directory.

  clean - delete buildable files for xxx only.

We also need these targets:  build-all, test-all, javadoc-all, and
clean-all.  These would build everything for both Java and C++.

We need to use these targest both from the command-line AND from within
our IDE (currently Eclipse).  A command-line example:

   $ cd dev/foo/src/java/com/company/foo/util
   $ ant clean-all test

The above would first delete all buildable .jar, .class and .dll files
from the whole project.  Then just the "util" package would be compiled,
built, and unit-tested (we are using JUnit).

We would prefer to rely on Ant's Core Tasks only, if at all possible.

The dev/foo/build.xml file uses <property
file="config/runtime.properties"> to bring in the common properties
definitions like:

  SRCDIR=${basedir}/${ant.project.name}
  CLASSES=classes
  LIB=lib
  CONFIG=config
  LOG=log
  JAVADOC_FTP_HOST=192.168.12.34
  JAVADOC_FTP_DIR=html/foo/api
  JAVADOC_FTP_USR=anonymous
  JAVADOC_FTP_PWD=none
  JUNIT_RUNNER=junit.textui.TestRunner

Finally, we need each package to first compile and/or build any packages
on which it depends.

[Doesn't everyone need to do this?]
  _  _  _  _  _  _  _

I have tried many combinations of <import>, <subant>, <ant>, <antcall>,
<target depends="...">, and <macrodef>.

I have hit brick walls every time (not Ant bugs).

For example:  To use Ant from the command line in any package directory,
there needs to be a build.xml file in each.  Ideally these would be as
small as possible to minimize Ant script code replication, ease
maintenance, and simpify the creation of new packages.  I tried many
ideas along the lines of Joe Schmetzer's post on 9-May-2005 to this
list.  Nothing has worked out.

My favorite aspect of Joe's solution was having each simply "name
itself" using the <project name="..."> attribute, and then rely on
${ant.project.name} to know what the originating package was.  Each of
those package-level Ant scripts was perfectly minimal:

    <project name="com/company/foo/admin"
            default="usage" basedir="../../../../../..">
        <import file="${basedir}/build.xml" optional="false"/>
    </project>

Anyway...

One of the key issues is:  how to handle the dependencies?

At the moment I'm out of time to write more (my carpool is here).  This
post is probably plenty long anyway.

Has anyone put together solutions like this?  Care to share some working
scripts?  Any other suggestions or recommendations?  Thank you.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to