2009-05-18 15 views
6

Sto lavorando a un semplice script di build che dovrebbe ottenere alcune costanti da un file di classe java e usarle come numeri di versione nei nomi dei miei file. Uso Eclipse e il suo Ant, ma metto bcel-5.2.jar nella mia cartella delle libs e nel classpath per la chiamata Ant.Proprietà carico caricamento fallito (errore 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> 

Ma purtroppo il compito formica LoadProperties fallisce:

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

Dopo di che ho provato a correre Ant dall'esterno Eclipse, utilizzando questa riga di comando:

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

Il risultato è

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 

Sono davvero perso ora. È un errore bcel? È un'incompatibilità Ant con il mio bcel?

Un ultimo suggerimento: Rimuovere la voce BCEL classpath dai risultati target Ant in questo:

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 Dopo aver impostato le preferenze di Ant in Eclipse, il messaggio di errore è cambiato:

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) 

Ora penso che sia forse un conflitto di versione tra Ant e BCEL. O BCEL e JDK1.6. O Eclipse e BCEL e Ant o JDK ... sono perso.


RISPOSTA:

Questo è il commento che trovate di seguito

avrei parlato di questo - non c'è bisogno di convertire nulla. Doc: "dal momento che Ant 1.7, la codifica dei caratteri ISO-8859-1 viene utilizzata per convertire i caratteri da byte, quindi UNO DEVE UTILIZZARE QUESTA CODIFICA per leggere il file di classe java." Questa è solo una convenzione per aggirare il fatto che un filtro di caratteri viene utilizzato su byte non elaborati. ant.apache.org/manual/CoreTypes/... Usando UTF-8 sarebbe male! - McDowell

+0

Penso che questo dipenderà da alcuni problemi di compatibilità con BCEL e JDK. "non è un file .class di Java" punta a una versione di classe non corrispondente (i primi 4 byte in .class) che non è riconosciuta da BCEL. Provo di nuovo a compilare con JDK1.4. – cringe

risposta

1

Crap, lo sapevo!Si tratta di archiviare i problemi di codifica. I file sono ancora in ISO-8819-1, ma sto usando UTF-8. Il progetto è piuttosto vecchio ed è stato creato con la codifica sbagliata in atto. Impostazione del parametro codifica nel javac e caricoproprietà L'attività lo risolve.

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

ho pensato che ha cambiato dal nostro server Subversion, ma credo di avere per convertire ogni singolo file in UTF-8 me stessa ... pensare che è un altro problema per il SO.

+3

Avrei dovuto accennare a questo: non è necessario convertire nulla. Doc: "dal momento che Ant 1.7, la codifica dei caratteri ISO-8859-1 viene utilizzata per convertire i caratteri dai byte ai byte, quindi UNO DEVE UTILIZZARE QUESTA CODIFICA per leggere il file di classe java." Questa è solo una convenzione per aggirare il fatto che un filtro di caratteri viene utilizzato su byte non elaborati. http://ant.apache.org/manual/CoreTypes/filterchain.html Usare UTF-8 sarebbe sbagliato! – McDowell

+0

Hm, non sono sicuro al 100% se ho capito bene. Rieseguirò la compilazione con i file convertiti e quelli originali e applicare/rimuovere il parametro di codifica per ottenere una risposta. Ma prima convertirò i file convertiti ... ;-) – cringe

+0

Ok, l'unico difetto era il parametro mancante codifica = "iso-8859-1". Grazie a @McDowell! Credo che dovrei avere RTFM l'intera catena di filtri. :-( – cringe

0

Sembra un errore di percorso di classe. Esegui "ant -v" per darti maggiori dettagli sugli errori.

1

Il documentation for loadproperties dice che l'elemento nidificato classpath è per l'utilizzo con il risorsa attributo - un'alternativa all'utilizzo SRCFILE.

Aggiungere il vaso BCEL al classpath globale. In Eclipse, aggiungilo come voce globale al classpath nello runtime preferences. Sulla riga di comando, utilizzare lo switch -lib.

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

+0

Ah, questo ha aiutato, almeno per alcuni secondi. Ho aggiornato la domanda. – cringe

Problemi correlati