webentwicklung-frage-antwort-db.com.de

Probleme beim Einstellen des Klassenpfads in ant

Ich habe Probleme, mein Java-Programm auszuführen (es verwendet einige JARs von Drittanbietern). Ich kann es gut kompilieren, aber wenn ich mein Laufziel in ant anrufe, heißt es, dass es nicht die Klasse finden kann, von der ich sagte, dass sie im Klassenpfad ausgeführt wird. So sieht meine build.xml aus:

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

Weiß jemand, was ich falsch machen könnte?


Hier ist meine Stack-Spur von Ameise:

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

Ich denke, das Problem liegt in Ihrer classpath-Pfaddeklaration. Das build-Verzeichnis sollte ein <pathelement> sein.

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

Ich würde auch nur dritte Party-Gläser in Ihre classpath refid aufnehmen. So sieht der ganze Block aus.

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

Wie DroidIn.net darauf hingewiesen hat, sollten Sie ein Paket für Ihr Programm erstellen.

So wie es ist - es werden nur Jars im lib-Verzeichnis relativ zu Ihrem Pfad geladen. Haben Sie alle Ihre 3. Party-Gläser dabei? Möglicherweise gibt es einige Laufzeitbibliotheken, die Sie zur Kompilierzeit nicht benötigen, die jedoch zur Laufzeit fehlen. Wenn du deinen Stacktrace postest, erzähle ich dir mehr :)

3
Bostone

Versuchen Sie dies, ich könnte meine Klasse laufen lassen.

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

0
sathiya