2009-10-15 115 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" />