Question

Je travaille sur un script simple de construction qui devrait obtenir des constantes d'un fichier de classe Java et les utiliser comme les numéros de version dans mes noms de fichiers. J'utilise Eclipse et sa propre Ant, mais mettre BCEL-5.2.jar dans mon dossier et libs dans le classpath pour l'appel Ant.

<target name="generate_version" depends="compile">
    <loadproperties srcfile="${dir.dest}/MyVersion.class">
        <classpath>
            <fileset dir="${dir.libs}">
                <include name="**/bcel*.jar"/>
            </fileset>
        </classpath>

        <filterchain>
            <classconstants/>
        </filterchain>
    </loadproperties>
</target>

Mais la tâche fourmi unfortunatly LoadProperties échoue:

build.xml:46: expected a java resource as source

Après que j'essayé de courir à l'extérieur Ant Eclipse, en utilisant cette ligne de commande:

set ANT_HOME=C:\Program Files\Java\ant\apache-ant-1.7.1
"%ANT_HOME%\bin\ant.bat"

Le résultat est

Buildfile: build.xml

init:
     [echo] Building project.
     [echo] ant.home:          C:\Program Files\Java\ant\apache-ant-1.7.1
     [echo] ant.java.version:  1.6
     [echo] ant.version:       Apache Ant version 1.7.1 compiled on June 27 2008

compile:
    [javac] Compiling 262 source files to **********\build
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

generate_version:

BUILD FAILED
********************\ant\build.xml:46: expected a java resource as source

Je suis vraiment perdu maintenant. Est-ce une erreur de bcel? Est-ce une incompatibilité Ant avec mon propre bcel?

Une dernière astuce: suppression de l'entrée bcel classpath à partir des résultats cibles Ant dans ceci:

Buildfile: build.xml

init:
     [echo] Building project.
     [echo] ant.home:          C:\Program Files\Java\ant\apache-ant-1.7.1
     [echo] ant.java.version:  1.6
     [echo] ant.version:       Apache Ant version 1.7.1 compiled on June 27 2008

compile:
    [javac] Compiling 262 source files to ********************\build
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

generate_version:

BUILD FAILED
java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassParser
        at org.apache.tools.ant.filters.util.JavaClassHelper.getConstants(JavaClassHelper.java:47)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

UPDATE Après avoir défini les préférences Ant dans Eclipse, le message d'erreur a changé:

BUILD FAILED
*********************\build.xml:46: org.apache.bcel.classfile.ClassFormatException:  is not a Java .class file
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:115)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)

Maintenant, je pense qu'il est peut-être un conflit de version entre Ant et BCEL. Ou BCEL et JDK1.6. Ou Eclipse et BCEL et Ant ou ... Je suis JDK perdu.


RÉPONSE:

Voici le commentaire ci-dessous trouvé

  

Je aurais dû le dire - vous n'avez pas besoin de convertir quoi que ce soit. Doc: « depuis Ant   1.7, le codage de caractères ISO-8859-1 est utilisé pour convertir les caractères de retour à   octets, donc on doit utiliser pour la lecture de cet encodage du fichier de classe Java « . Ceci est juste un   convention pour contourner le fait qu'un filtre de caractères est utilisé sur les octets brutes.   ant.apache.org/manual/CoreTypes/...-8 en UTF serait mauvais! - McDowell

Était-ce utile?

La solution

Merde, je le savais! Il se résume à déposer des problèmes de codage. Les fichiers sont toujours en ISO-8819-1, mais je suis en utilisant UTF-8. Le projet est assez âgé et a été créé avec le mauvais encodage en place. Réglage du paramètre encodage javac et LoadProperties Tâche il fixe.

<target name="generate_version" depends="compile">
    <loadproperties encoding="iso-8859-1" srcfile="${dir.dest}/MyVersion.class">
        <filterchain>
            <classconstants/>
        </filterchain>
    </loadproperties>
</target>

Je pensais que quelqu'un l'a modifié par notre serveur Subversion, mais je pense que je dois convertir chaque fichier en UTF-8 moi-même maintenant ... pense que c'est une autre question SO.

Autres conseils

Le pour LoadProperties dit que la nichée classpath est à utiliser avec ressource attribut -. une alternative à l'utilisation de srcfile

Ajoutez le pot de BCEL à votre classpath global. Dans Eclipse, ajoutez une entrée globale à votre classpath dans la section préférences d'exécution . Sur la ligne de commande, utilisez le commutateur -Lib.


(source: Eclipse

On dirait une erreur de classpath. Exécuter « -v fourmi » pour vous donner plus de détails sur les erreurs.

scroll top