2009-05-18 19 views
6

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

+0

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

Respuesta

1

Mierda, yo lo sabía!Todo se reduce a problemas de codificación de archivos. Los archivos están todavía en ISO-8819-1, pero estoy usando UTF-8. El proyecto está bastante viejo y fue creado con la codificación incorrecta en su lugar. Estableciendo el parámetro que codifica en el javac y loadproperties La tarea lo corrige.

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

pensé que se cambió por nuestro servidor de Subversion, pero yo creo que tengo que convertir cada archivo a UTF-8 yo ahora ... pensar que es otra cuestión para el SO.

+3

Debería haberlo mencionado, no necesitas convertir nada. Doc: "desde Ant 1.7, la codificación de caracteres ISO-8859-1 se usa para convertir los caracteres a bytes, por lo que UNO DEBE 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 procesar. http://ant.apache.org/manual/CoreTypes/filterchain.html ¡Usar UTF-8 sería malo! – McDowell

+0

Hm, no estoy 100% seguro si lo hago bien. Voy a volver a ejecutar la compilación con los archivos convertidos y los originales y aplicar/eliminar el parámetro de codificación para obtener una respuesta. Pero confirmaré primero los archivos convertidos ... ;-) – cringe

+0

Bien, realmente el único defecto fue la codificación del parámetro faltante = "iso-8859-1". Gracias @McDowell! Creo que debería haber RTFM toda la cadena de filtros. :-( – cringe

0

Parece un error de classpath. Ejecute "ant -v" para darle más detalles sobre los errores.

1

El documentation for loadproperties dice que la ruta de clase anidada elemento es para su uso con el recurso atributo - una alternativa al uso srcfile.

Agregue el contenedor BCEL a su classpath global. En Eclipse, agréguelo como una entrada global a su classpath en el runtime preferences. En la línea de comando, use el interruptor -lib.

alt text http://help.eclipse.org/ganymede/topic/org.eclipse.platform.doc.user/images/Image91_ant_prefs_1.png

+0

Ah, eso ayudó, al menos por algunos segundos. Actualicé la pregunta. – cringe

Cuestiones relacionadas