Estoy trabajando en un script de compilación simple que debería obtener algunas constantes de un archivo de clase java y usarlas como números de versión en mis nombres de archivo. Yo uso Eclipse y su propia Ant, pero pongo bcel-5.2.jar en mi carpeta libs y en el classpath para la llamada Ant.Ant loadproperties failed (error de bcel?)
<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>
Pero desafortunadamente la tarea ant LoadProperties falla:
build.xml:46: expected a java resource as source
Después de eso traté de ejecutar Ant desde fuera Eclipse, usando esta línea de comandos:
set ANT_HOME=C:\Program Files\Java\ant\apache-ant-1.7.1
"%ANT_HOME%\bin\ant.bat"
El resultado es
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
Estoy realmente perdido ahora. ¿Es un error de bcel? ¿Es una incompatibilidad Ant con mi propio bcel?
Una última sugerencia: Extracción de la entrada BCEL ruta de clases a partir de los resultados de la tarea ant en esto:
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)
ACTUALIZACIÓN Después de configurar las preferencias de Ant en Eclipse, el mensaje de error cambió:
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)
Ahora creo que es quizás un conflicto de versiones entre Ant y BCEL. O BCEL y JDK1.6. O Eclipse y BCEL y Ant o JDK ... Estoy perdido.
RESPUESTA:
Este es el comentario que se encuentra debajo
debería haber mencionado esto - no es necesario para convertir cualquier cosa. Doc: "desde Ant 1.7, la codificación de caracteres ISO-8859-1 se usa para convertir los caracteres a bytes, por lo que HAY QUE UTILIZAR ESTA CODIFICACIÓN para leer el archivo de la clase java". Esta es solo una convención para evitar el hecho de que un filtro de caracteres se está utilizando en bytes sin formato. ant.apache.org/manual/CoreTypes/... ¡Usar UTF-8 sería malo! - McDowell
Creo que esto se reducirá a algunos problemas de compatibilidad con BCEL y el JDK. "no es un archivo .class de Java" apunta a una versión de clase no coincidente (los primeros 4 bytes en clase.) que BCEL no reconoce. Intento compilar con JDK1.4 nuevamente. – cringe