2009-10-15 3 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

содержатся ли Lib каталога в каталоге Src? Если у вас есть отдельный каталог src, который используется как basedir, а lib находится на том же уровне, что и src, тогда вам нужно будет создать baseir .. и указать свойство src в качестве исходного каталога. Или вы можете перенести свой скрипт Ant на один каталог. –

+0

Вы используете пакет по умолчанию в своих источниках? Если нет, возможно, вам нужно включить «**/*. Class» в ваш путь к классам. –

ответ

3

Так оно и есть - только банки внутри lib каталога относительно вашего пути становятся загружены. У вас есть все ваши 3-х партийные банки? Могут быть некоторые библиотеки времени выполнения, которые вам не нужны во время компиляции, но которые отсутствуют во время выполнения. Если вы разместите свой стек, я расскажу вам больше :)

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

Кроме того, я бы включать только 3-й партии банки в вашем classpath RefID. Так выглядит весь блок.

<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/sun/media/codec/audio/AudioCodec вместо a Не удалось найти GuiStarter. Удостоверьтесь, что у вас есть это в вашей ошибке пути к классу. Я думаю, что для этого проекта было бы проще разместить банки в моем каталоге ant lib. – David

+0

НЕ помещайте банки в каталог ant lib. Похоже, что 3-й партийный инструмент имеет зависимость от вышеупомянутой библиотеки. Возможно, это укажет вам в правильном направлении 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" /> 

 Смежные вопросы

  • Нет связанных вопросов^_^