2009-05-18 7 views
6

Ich arbeite an einem einfachen Build-Skript, das einige Konstanten aus einer Java-Klassendatei erhalten und sie als Versionsnummern in meinen Dateinamen verwenden soll. Ich benutze Eclipse und seine eigene Ant, aber setze bcel-5.2.jar in meinen libs-Ordner und in den Klassenpfad für den Ant-Aufruf.Ant loadproperties fehlgeschlagen (bcel error?)

<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> 

Aber leider die Ant-Task LoadProperties versagt:

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

Danach habe ich versucht, Ant von außen Eclipse mit dieser Befehlszeile auszuführen:

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

Das Ergebnis ist

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 

Ich bin jetzt wirklich verloren. Ist es ein Bcel-Fehler? Ist es eine Ant-Inkompatibilität mit meinem eigenen bcel?

Ein letzter Hinweis:

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 Nach der Einstellung der Ant-Einstellungen in Eclipse, die Fehlermeldung geändert:

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) 
den bcel Classpath Eintrag aus dem Ant-Ziel führt dies Entfernen

Jetzt denke ich, es ist vielleicht ein Versionskonflikt zwischen Ant und BCEL. Oder BCEL und JDK1.6. Oder Eclipse und BCEL und Ant oder JDK ... Ich bin verloren.


ANTWORT:

Dies ist der Kommentar unten

gefunden

sollte ich das erwähnt haben - Sie brauchen nichts zu konvertieren. Doc: "seit Ant 1.7, wird die Zeichenkodierung ISO-8859-1 verwendet, um von Zeichen zurück in Bytes zu konvertieren, so dass man diese Kodierung zum Lesen der Java-Klassendatei verwenden muss." Dies ist nur eine Konvention um die Tatsache zu umgehen, dass ein Zeichenfilter auf rohen Bytes verwendet wird. ant.apache.org/manual/CoreTypes/... UTF-8 wäre schlecht! - McDowell

+0

Ich denke, das wird auf einige Kompatibilitätsprobleme mit BCEL und dem JDK kommen. "ist keine Java-.class-Datei" verweist auf eine nicht übereinstimmende Klassenversion (die ersten 4 Bytes in .class), die von BCEL nicht erkannt wird. Ich versuche erneut mit JDK1.4 zu kompilieren. – cringe

Antwort

1

Mist, ich wusste es!Es kommt auf Dateicodierungsprobleme an. Die Dateien sind immer noch in ISO-8819-1, aber ich benutze UTF-8. Das Projekt ist ziemlich alt und wurde mit der falschen Kodierung erstellt. Einstellen des Parameters Codierung in javac und loadproperties Task behebt es.

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

Ich dachte, es von unserem Subversion-Server geändert wurde, aber ich glaube, ich habe jede einzelne Datei in UTF-8 mich jetzt konvertieren ... denken, dass eine andere Frage für SO ist.

+3

Ich hätte das erwähnen sollen - Sie müssen nichts konvertieren. Doc: "Seit Ant 1.7 wird die Zeichenkodierung ISO-8859-1 verwendet, um von Zeichen zurück in Bytes zu konvertieren, also MUSS DIESES ENCODING für das Lesen der Java-Klassendatei verwendet werden." Dies ist nur eine Konvention, um die Tatsache zu umgehen, dass ein Zeichenfilter für rohe Bytes verwendet wird. http://ant.apache.org/manual/CoreTypes/filterchain.html Die Verwendung von UTF-8 wäre schlecht! – McDowell

+0

Hm, ich bin mir nicht 100% sicher, ob ich es richtig verstehe. Ich werde den Build mit den konvertierten Dateien und den ursprünglichen Dateien erneut ausführen und den Codierungsparameter anwenden/entfernen, um eine Antwort zu erhalten. Aber ich werde die konvertierten Dateien erst übernehmen ... ;-) – cringe

+0

Ok, wirklich der einzige Fehler war der fehlende Parameter encoding = "iso-8859-1". Danke @McDowell! Ich denke, ich sollte die gesamte Filterkette rtfm haben. :-( – cringe

0

Sieht aus wie ein Klassenpfadfehler. Führen Sie "ant -v" aus, um weitere Details zu Fehlern zu erhalten.

1

Die documentation for loadproperties sagt, dass das verschachtelte Classpath Element zur Verwendung mit dem Ressource ist Attribut - eine Alternative zur Verwendung srcfile.

Fügen Sie das BCEL-Glas zu Ihrem globalen Klassenpfad hinzu. Fügen Sie es in Eclipse als globalen Eintrag zu Ihrem Klassenpfad in runtime preferences hinzu. Verwenden Sie in der Befehlszeile den Schalter -lib.

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

+0

Ah, das hat geholfen - zumindest für einige Sekunden. Ich habe die Frage aktualisiert. – cringe