tags:

views:

69

answers:

2

EDIT: I ended up setting up the whole project in Eclipse and was able to get it to build. I'm not sure why this problem occurred and hopefully I'll never have to find out.

I'm having a problem where my build is reporting "BUILD FAILED" without reporting any errors.

I'm building a large application of a lot of old code which I now have the joy of modifying. Most of the other developers have set up their builds with Eclipse, but I'm trying to build it through the existing build.xml files.

After getting my classpath set, the build runs smoothly, but shortly after starting the compile step, it returns:

Lots of "[javac] file.java" lines.

BUILD FAILED
<project path>/build.xml:201: Compile failed; see the compiler error output for details.

This is less than helpful. The build.log has no additional information other than the stack trace:

at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1085)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:885)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
at org.apache.tools.ant.Main.runBuild(Main.java:758)
at org.apache.tools.ant.Main.startAnt(Main.java:217)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)

Adding the -debug flag to ant creates mountains of information, and with such a long classpath (so many jars) it is hard to sort through it.

Here's the target in ant:

  <target name="compile" depends="achmetadata">
    <mkdir dir="${path.build.classes}"/>
    <javac
      listfiles="yes"
      destdir="${path.build.classes}"
      classpathref="project.classpath"
      debug="on"
      deprecation="on"
      fork="yes"
      nowarn="no"
      memoryMaximumSize="512M"
      srcdir="${path.src.java}"
      source="1.4"
      target="1.4"
      >
    -><src path="${path.build.src}"/>
      <patternset refid="production-code"/>
    </javac>
  </target>

The classpath is set through that classpathref and has a lot of jars included through and tags.

Any thoughts on what I should be lookinf for? What would cause ant to fail like this?

A: 

CLASSPATH should be set inside the build.xml itself. If you're depending on a CLASSPATH environment variable, you're making a mistake.

See if this build.xml works better. Study the directory structure and make yours match that spelled out in the build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="xslt-converter" basedir="." default="package">

    <property name="version" value="1.6"/>
    <property name="haltonfailure" value="no"/>

    <property name="out" value="out"/>

    <property name="production.src" value="src"/>
    <property name="production.lib" value="lib"/>
    <property name="production.resources" value="config"/>
    <property name="production.classes" value="${out}/production/${ant.project.name}"/>

    <property name="test.src" value="test"/>
    <property name="test.lib" value="lib"/>
    <property name="test.resources" value="config"/>
    <property name="test.classes" value="${out}/test/${ant.project.name}"/>

    <property name="exploded" value="out/exploded/${ant.project.name}"/>
    <property name="exploded.classes" value="${exploded}/WEB-INF/classes"/>
    <property name="exploded.lib" value="${exploded}/WEB-INF/lib"/>

    <path id="production.class.path">
        <pathelement location="${production.classes}"/>
        <pathelement location="${production.resources}"/>
        <fileset dir="${production.lib}">
            <include name="**/*.jar"/>
            <exclude name="**/junit*.jar"/>
            <exclude name="**/*test*.jar"/>
        </fileset>
    </path>

    <path id="test.class.path">                            
        <path refid="production.class.path"/>
        <pathelement location="${test.classes}"/>
        <pathelement location="${test.resources}"/>
        <fileset dir="${test.lib}">
            <include name="**/junit*.jar"/>
            <include name="**/*test*.jar"/>
        </fileset>
    </path>

    <path id="testng.class.path">
        <fileset dir="${test.lib}">
            <include name="**/testng*.jar"/>
        </fileset>
    </path>

    <available file="${out}" property="outputExists"/>

    <target name="clean" description="remove all generated artifacts" if="outputExists">
        <delete dir="${out}" includeEmptyDirs="true"/>
        <delete dir="${reports.out}" includeEmptyDirs="true"/>
    </target>

    <target name="create" description="create the output directories" unless="outputExists">
        <mkdir dir="${production.classes}"/>
        <mkdir dir="${test.classes}"/>
        <mkdir dir="${reports.out}"/>
        <mkdir dir="${junit.out}"/>
        <mkdir dir="${testng.out}"/>
        <mkdir dir="${exploded.classes}"/>
        <mkdir dir="${exploded.lib}"/>
    </target>

    <target name="compile" description="compile all .java source files" depends="create">
        <!-- Debug output
                <property name="production.class.path" refid="production.class.path"/>
                <echo message="${production.class.path}"/>
        -->
        <javac srcdir="src" destdir="${out}/production/${ant.project.name}" debug="on" source="${version}">
            <classpath refid="production.class.path"/>
            <include name="**/*.java"/>
            <exclude name="**/*Test.java"/>
        </javac>
        <javac srcdir="${test.src}" destdir="${out}/test/${ant.project.name}" debug="on" source="${version}">
            <classpath refid="test.class.path"/>
            <include name="**/*Test.java"/>
        </javac>
    </target>

</project>
duffymo
I am using a path in the build.xml, not writing out the CLASSPATH. What I meant was that running ant with debug prints out the CLASSPATH that is passed to javac, which has around 50 jars in it (big project).I also added the target from my build.xml.
Periodic
Try my build.xml and see if it does any better.
duffymo
I tried a simpler build.xml. Stripping out all but the javac (and there were a lot of targets and steps for a full build on this project) but unfortunately, no luck. I ended up setting the whole project up in Eclipse and that seems to have been successful.
Periodic
Did you try the build.xml that I gave you?
duffymo
A: 

Can you run your ant build in debug mode so that you can step through it? Set a break point in your build.xml. Then Right click on the build.xml and select Debug As -> Ant Build (assuming you are using Eclipse). This might help you to figure out your issue.

HTH.

CoolBeans
I wasn't using Eclipse at the time. the debug flag didn't help much.I did end up setting up the whole project in eclipse and eclipse was able to build it successfully.
Periodic
okay if you could build it using eclipse, then you should make sure your paths in the build.xml are identical to the one that eclipse has set in the project properties (.classpath file of the project).
CoolBeans