2009-10-15 15 views
16

Mam problemy z uruchomieniem mojego programu Java (korzysta z plików JAR innej firmy). Mogę to skompilować dobrze, ale kiedy wołam mój cel run w mrówce, mówi on, że nie może znaleźć klasy, którą powiedziałem, że uruchomi się w ścieżce klas. Oto co moja build.xml wygląda następująco:Problemy z ustawianiem ścieżki klasy w mrówce

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

Czy ktoś wie co I może być robić niewłaściwy?


Oto mój ślad stosu z 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 
+0

jest katalog lib zawarte w katalogu src? Jeśli masz oddzielny katalog src używany jako baza danych, a lib jest na tym samym poziomie, co src, musisz utworzyć bazę danych .. i określić katalog src jako katalog źródłowy. Możesz też przenieść swój skrypt Ant do jednego katalogu. –

+0

Czy używasz pakietu domyślnego w swoich źródłach? Jeśli nie, prawdopodobnie musisz dodać "**/*. Class" do swojej ścieżki klas. –

Odpowiedz

3

tak jest - tylko słoiki wewnątrz katalogu lib stosunku do ścieżki są ładowane uzyskiwanie. Czy masz tam wszystkie słoiki z trzecimi imprezami? Mogą istnieć pewne biblioteki uruchomieniowe, których nie potrzebujesz w czasie kompilacji, ale których brakuje w czasie wykonywania. Jeśli opublikujesz swój stacktrace, powiem ci więcej :)

+0

Mój stacktrace nie zmieścił się w tym komentarzu, więc udzieliłem odpowiedzi na to pytanie. – David

+0

Hm - GuiStarter brzmi, jakbyś miał klasę, która nie ma pakietu (czy jest to jedna z twoich?) - w takim przypadku musisz się upewnić, że katalog najwyższego poziomu znajduje się w ścieżce Classpath również – Bostone

+0

Dzięki, to było naprawdę pomocne ! Nawet 3 lata później :) –

5

Myślę, że problem dotyczy Twojej deklaracji ścieżki classpath. Katalog build powinny być <pathelement>

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

Również chciałbym to tylko 3-RD słoiki partia w swoim classpath refid. Tak wygląda cały blok.

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

Ponadto, jak wskazał DroidIn.net, należy utworzyć pakiet dla swojego programu.

+0

Zgadzam się - myślę, że "patelement" to jest to, czego używasz do zajęć – Bostone

+0

Z tymi modyfikacjami otrzymuję wyjątek java.lang.NoClassDefFoundError: com/sun/media/codec/audio/AudioCodec zamiast a Nie można znaleźć GuiStarter. Upewnij się, że masz go w błędzie ścieżki klas. Myślę, że dla tego projektu łatwiej byłoby umieścić słoiki w moim katalogu mrówek. – David

+0

NIE umieszczaj słoików w katalogu ant lib. Wygląda na to, że narzędzia trzeciej strony mają zależność od powyższej biblioteki. Może to wskaże ci właściwy kierunek http://ubuntuforums.org/archive/index.php/t-351989.html –

0

Spróbuj tego, mógłbym poprowadzić moją klasę.

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

Powiązane problemy