web-dev-qa-db-fra.com

Problèmes de définition du classpath dans ant

Je ne parviens pas à exécuter mon programme Java (il utilise des fichiers JAR tiers). Je peux bien le compiler, mais lorsque j'appelle ma cible d'exécution dans ant, il dit qu'il ne peut pas trouver la classe que je lui ai indiquée de s'exécuter dans le classpath. Voici à quoi ressemble mon build.xml:

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

Est-ce que quelqu'un sait ce que je pourrais faire mal?


Voici ma trace de pile de 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
16
David

Je pense que le problème vient de votre déclaration de chemin classpath. Le répertoire build devrait être un <pathelement>

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

De plus, je n'inclurais que les pots de tierces parties dans votre classpath refid. Donc, tout le bloc ressemble.

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

En outre, comme DroidIn.net l’a souligné, vous devez créer un package pour votre programme.

5

En réalité, seuls les fichiers JAR du répertoire lib relatifs à votre chemin sont chargés. Avez-vous tous vos pots de tierce partie là-bas? Il peut y avoir certaines bibliothèques d'exécution dont vous n'avez pas besoin au moment de la compilation, mais qui manquent au moment de l'exécution. Si vous postez votre pile, je vous en dirai plus :)

3
Bostone

Essayez ceci, je pourrais pouvoir diriger ma classe.

<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