Ant LoadProperties a échoué (erreur de bcel?)
-
22-08-2019 - |
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
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.
On dirait une erreur de classpath. Exécuter « -v fourmi » pour vous donner plus de détails sur les erreurs.
(source: Eclipse