2009-10-15 65 views
16

我在运行Java程序时遇到了问题(它使用了一些第三方JAR)。我可以编译它,但是当我在ant中调用我的运行目标时,它说它无法找到我告诉它在类路径中运行的类。下面是我的build.xml样子:在ant中设置类路径的问题

<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> 

有谁知道我可能是做错了什么?


这里是我的堆栈跟踪从蚂蚁:

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 
+0

包含src目录内的lib目录?如果你有一个单独的src目录作为basedir,并且lib与src处于同一级别,那么你必须创建basedir ..并指定属性src作为源目录。或者你可以将你的Ant脚本移动到一个目录中。 –

+0

你在源代码中使用默认包吗?如果不是,你可能需要在类路径中包含“**/*。class”。 –

回答

3

事情是这样的 - 里面只有越来越加载相对于你的路径lib目录罐子。你有没有所有的第三方派对用具?可能有一些运行时库在编译时不需要,但在运行时会丢失。如果你发布你的堆栈跟踪,我会告诉你更多:)

+0

我的堆栈跟踪不适合这个评论,所以我把它作为这个问题的答案。 – David

+0

Hm - GuiStarter听起来像你有一个没有包的类(这是你的吗?) - 在这种情况下,你需要确保你的顶级目录也在Classpath中 – Bostone

+0

谢谢,这真的很有帮助!甚至3年后:) –

5

我认为问题是你的classpath路径声明。该build目录应该是一个<pathelement>

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

而且,我只会在您classpath REFID 3 - 第三方罐子。所以整个模块看起来像。

<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> 

另外,正如DroidIn.net指出的那样,您应该为您的程序创建一个包。

+0

我同意 - 我认为“pathelement”,这就是你用于类 – Bostone

+0

这些修改我得到一个java.lang.NoClassDefFoundError:COM /太阳/媒体/编解码器/音频/ AudioCodec异常,而不是a找不到GuiStarter。确保你的类路径有错误。 我认为这个项目将更容易把罐子放在我的ant lib目录中。 – David

+0

请勿将jar放入ant lib目录。看起来第三方工具依赖于上面的库。也许这会让你指向正确的方向http://ubuntuforums.org/archive/index.php/t-351989.html –

0

试试这个,我可以运行我的课程。

<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="sample.Sample" /> 

<target name="clean"> 
    <delete dir="${classes.dir}" /> 
</target> 

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

<target name="compile"> 
    <mkdir dir="${classes.dir}" /> 
    <javac srcdir="${src.dir}" destdir="${classes.dir}"> 
     <classpath refid="classpath" /> 
    </javac> 
</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 classname="${main-class}"> 
     <classpath refid="classpath" /> 
    </java> 
</target> 

<target name="clean-build" depends="clean,jar" /> 

<target name="main" depends="clean,run" />