views:

836

answers:

4

Hi, I'm having problems getting my Java program to run (it uses some third party .jar s). I can compile it fine but when I call my run target in ant it says it can't find the class that I told it run in the classpath. Here's what my build.xml looks like:

<project basedir="." default="build">
<property name="build" value="build" />
<property name="src" value="." />
<property name="lib" value="lib" />

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

<target name="build">
    <javac srcdir="${src}" destdir="${build}">
        <classpath refid="classpath" />
    </javac>
</target>

<target name="run">
    <java classname="FirstClass">
        <classpath refid="classpath" />
    </java>
</target>

Does anyone know what I might be doing wrong?

+1  A: 

The way it is - only jars inside lib directory relative to your path are getting loaded. Do you have all of your 3-rd party jars there? There may be some run-time libraries that you don't need at compile time but which are missing at run time. If you post your stacktrace I'll tell you more :)

DroidIn.net
My stacktrace couldn't fit in this comment so I made it an answer to this question.
David
Hm - GuiStarter sounds like you have a class that doesn't have a package (is it one of yours?) - in which case you need to make sure your top level directory is in the Classpath also
DroidIn.net
A: 

Here's my stack trace from ant.

ant run Buildfile: build.xml

run: [java] Could not find GuiStarter. Make sure you have it in your classpath [java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:138) [java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:764) [java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:218) [java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:132) [java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:105) [java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) [java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [java] at java.lang.reflect.Method.invoke(Method.java:616) [java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) [java] at org.apache.tools.ant.Task.perform(Task.java:348) [java] at org.apache.tools.ant.Target.execute(Target.java:357) [java] at org.apache.tools.ant.Target.performTasks(Target.java:385) [java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) [java] at org.apache.tools.ant.Project.executeTarget(Project.java:1306) [java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) [java] at org.apache.tools.ant.Project.executeTargets(Project.java:1189) [java] at org.apache.tools.ant.Main.runBuild(Main.java:758) [java] at org.apache.tools.ant.Main.startAnt(Main.java:217) [java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) [java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) [java] Java Result: -1

BUILD SUCCESSFUL Total time: 1 second

David
+1  A: 

I think the problem is with your classpath path declaration. The build directory should be a <pathelement>

<path id="classpath">
    <fileset dir="${lib}">
        <include name="**/*.jar" />
    </fileset>
    <pathelement location="${build}" />
</path>

Also, I would only include 3-rd party jars in your classpath refid. So the whole block looks like.

<path id="3rd-party-classpath">
    <fileset dir="${lib}">
        <include name="**/*.jar" />
    </fileset>
</path>

<target name="build">
    <javac srcdir="${src}" destdir="${build}">
        <classpath refid="3rd-party-classpath" />
    </javac>
</target>

<target name="run">
    <java classname="FirstClass">
      <classpath>
        <pathelement location="${build}" />
        <path refid="3rd-party-classpath" />
      </classpath>
    </java>
</target>

Also, as DroidIn.net has pointed out, you should create a package for you program.

Alexander Pogrebnyak
I agree - I think "pathelement" that's what you use for classes
DroidIn.net
With these modifications I'm getting an java.lang.NoClassDefFoundError: com/sun/media/codec/audio/AudioCodec exception instead of a Could not find GuiStarter. Make sure you have it in your classpath error.I think for this project it would be easier to put the jars in my ant lib directory.
David
DON'T put the jars into the ant lib directory. Looks like the 3-rd party tools have dependency on the above library. Maybe this will point you in the right direction http://ubuntuforums.org/archive/index.php/t-351989.html
Alexander Pogrebnyak
A: 

There is no answer. Programming is not worth it if you have to do so much work just to use some extra libraries in your code. Downvote this into oblivion.

David